The codes below will allow the computation of the BNA score for any city in Europe. The coding languages are a combination of R and SQL, with a few lines passed onto the Command Prompt.

Case study: Cambridge, UK

Workflow step by step

1. Establish a connection with the PostgreSQL server and establish basic parameters of analysis.

Within this step, three major things are performed, assuming that the user has created a database on its PostgreSQL. To test conneciton an empty table on the database called “test” was created on the public schema.

- Create connection and test it

library(RPostgreSQL)
# LOAD POSTGRESQL DRIVER
driver <- dbDriver("PostgreSQL")
# CREATE CONNECTION TO THE POSTGRESQL DATABASE
# THE CONNECTION VARIABLE WILL BE USED FOR ALL FURTHER OPERATIONS
connection <- dbConnect(
  driver, 
  dbname = db_name,
  host = local_host, 
  port = port_num,
  user = user_name, 
  password = rstudioapi::askForPassword("Database password")
)
ifelse(
  !dbExistsTable(connection, "test"),
  "The connection to the database was not possible.",
  "The connection to the database was successful!"
)
[1] "The connection to the database was successful!"
# DISCONNECT: Important when modifying the database on pgadmin4
# dbDisconnect(connection)

- Set up database

NOTICE:  extension "hstore" already exists, skipping
NOTICE:  extension "postgis" already exists, skipping
NOTICE:  extension "pgrouting" already exists, skipping
NOTICE:  schema "destinations" already exists, skipping
NOTICE:  schema "generated" already exists, skipping
NOTICE:  schema "received" already exists, skipping

- Establish Study Area and other important variables

Not only the name of the study area should be established, but also the number of subdivisions for the grid, the coordinate reference system to work with, and the biking distance that will be assumed for the connectivity analysis.

sa_name = "Cambridge"
subdivisions = 4
sa_crs = 3857
biking_distance = 3000 ## in meters
paste("You are running the BNA score for", sa_name, "within a biking distance of", biking_distance/1000, "km.")
[1] "You are running the BNA score for Cambridge within a biking distance of 3 km."

2. Obtain study area boundary with osmdata.

Extract the study area boundary considering a buffer of half the biking distance established.

# FUNCTION TO EXTRACT STUDY AREA BOUNDARY WITH OSM AND WRITE IT TO THE DATABASE
sa_bb <- function (study_area, dist, crs, conn){
  # GET DATA FROM OSM
  library(osmdata)
  library(sf)
  study_area_bb <- study_area %>% 
    getbb(format_out = "sf_polygon") %>%
    st_transform(crs = crs)
  
  ## ADD A BUFFER TO THE BOUNDARY
  study_area_bb <-study_area_bb %>% 
    st_buffer(dist = 0.5*dist)
  
  # DELETE EXISTING BOUNDARY
  library(sqldf)
  sqldf(
    "DROP TABLE IF EXISTS received.sa_boundary",
    connection = conn
  )
  # UPLOAD BOUNDARY TO POSTGRESQL DATABASE
  library(RPostgreSQL)
  dbWriteTable(conn, c("received","sa_boundary"), study_area_bb)
  
  study_area_bb
}
boundary <- sa_bb(
  study_area = sa_name, 
  dist = biking_distance,
  crs = sa_crs, 
  conn = connection
)
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
qtm(
  shp = boundary, 
  fill = NULL, 
  borders = "red", 
  basemaps = "OpenStreetMap"
)

3. Obtain the .osm file from Overpass API

# FUNCTION TO DOWNLOAD OSM DATA WITH THE OVERPASS API 
sa_download <- function(conn){
  # OBTAIN THE EXTENT OF THE STUDY AREA AS A BOUNDING BOX
  sa_extent <- dbGetQuery(conn,
        "SELECT
        ST_Extent((ST_Transform(geometry,4326)))
        FROM received.sa_boundary") 
  
  library(stringr)
  sa_coord <- toString(sa_extent) %>% 
    str_extract_all("\\-*\\d+\\.*\\d*") %>% 
    unlist() %>% 
    toString()
    
  # CONSTRUCT THE API LINE TO REQUEST THE DATA
  api <- paste(
    'https://overpass-api.de/api/map?bbox=',
    sa_coord,
    sep = ''
  )
  
  # CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
  cd <- getwd()
  ifelse(
    !file.exists(file.path(cd,'temp')),
    dir.create(file.path(cd,'temp')), 
    "Directory already exists"
  )
  
  # ESTABLISH THE NAME OF THE FILE WHERE THE OVERPASS API WILL DOWNLOAD ITS DATA
  osm_file <- file.path(cd,'temp','overpass.osm')
  
  # REQUEST THE DATA FROM THE API
  library(utils)
  download.file(url = api, destfile = osm_file, extra = '-nv -O') 
  
  ifelse(
    file.exists(file.path(cd,'temp','overpass.osm')),
    "OMS data successfully downloaded!",
    "OSM data was not downloaded, please try again or download manually."
  )
  
}
# DOWNLOAD THE DATA FROM OSM WITH OVERPASS API
sa_download(conn = connection)
trying URL 'https://overpass-api.de/api/map?bbox=0.0551641725691649, 52.1496753485212, 0.19802494271238, 52.2454796501678'
Content type 'application/osm3s+xml' length unknown
downloaded 86.9 MB
[1] "OMS data successfully downloaded!"

4. Load data into the PostgreSQL database.

- Obtain configuration files

# CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
cd <- getwd()
ifelse(
  !file.exists(file.path(cd,'temp')),
  dir.create(file.path(cd,'temp')), 
  "Directory already exists"
)
[1] "Directory already exists"
# ESTABLISH THE NAME OF THE FILES 
pfbstyle_file <- file.path(cd,'temp','pfb.style')
mapconfig_file <- file.path(cd,"temp","mapconfig.xml")
mapconfigbikes_file <- file.path(cd,"temp","mapconfig_for_bicycles.xml")
# CHECK IF THEY ARE DOWNLOADED
if(
  file.exists(file.path(pfbstyle_file)) & 
  file.exists(file.path(mapconfig_file)) &
  file.exists(file.path(mapconfigbikes_file))
){
  "Files are already downloaded!"
} else {
 # ESTABLISH THE URLS
  pfbstyle_url <- "https://raw.githubusercontent.com/azavea/pfb-network-connectivity/develop/src/analysis/import/pfb.style"
  
  mapconfig_url <- "https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig.xml"
  
  mapconfigbikes_url <- 
  "https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig_for_bicycles.xml"
  
  # REQUEST THE DATA
  library(utils)
  download.file(url = pfbstyle_url, destfile = pfbstyle_file)
  download.file(url = mapconfig_url, destfile = mapconfig_file)
  download.file(url = mapconfigbikes_url, destfile = mapconfigbikes_file) 
}
[1] "Files are already downloaded!"

- Load data with osm2pgsql and osm2pgrouting

NOTE: To run this command create a password file on %APPDATA%/postgresql/pgpass.conf with the format hostname:port:database:username:password

Replace variables between %:

system(
  command = "osm2pgsql -c -d %DBNAME% -U %USERNAME% -H %HOSTNAME% -W --create --prefix sa_full -S %CURRENTDIRECTORY/temp/pfb.style% %CURRENTDIRECTORY/temp/overpass.osm% --cache 600",
  show.output.on.console = TRUE
  )

system(
  command = "osm2pgrouting -f %CURRENTDIRECTORY/temp/overpass.osm% -h %HOSTNAME% --password %DBPASSWORD% -d %DBNAME% --username %USERNAME% --schema received --prefix sa_all_ --conf %CURRENTDIRECTORY/temp/mapconfig.xml% --clean",
  show.output.on.console = TRUE
)

system(
  command = "osm2pgrouting -f %CURRENTDIRECTORY/temp/overpass.osm% -h %HOSTNAME% --password %DBPASSWORD% -d %DBNAME% --username %USERNAME% --schema received --prefix sa_bike_ --conf %CURRENTDIRECTORY/temp/mapconfig_for_bicycles.xml% --clean",
  show.output.on.console = TRUE
)

5. Organize and prepare the database

On this step, several SQL queries are being run to organize the tables, clip them to the study area outline, merge it with the osm2pgsql data among other things. The scripts include mainly the code that PfB already uses, but with some modifications like changing feet to meters, mph to km/h, and others. Basically, 4 steps are taken:

- Organize tables

Which drops unused columns and projects data to the already established CRS. It also cleans the database for a new analysis to be run if the study area is changed for example.

- Clip data into boundary

Which clips the data into the boundary of the study area selected.

- Populate way table

Which does modifications to the following columns on the ways table:

> one way
> width
> functional class
> paths
> speed limit
> lanes
> park
> bike infrastructure
> class adjustments

- Populate intersection table

Which does modifications to the following columns on the intersection table.

> legs
> signalized
> stops
> rrfb
> island

An example of how the tables look like after this step:

SELECT * FROM received.sa_ways LIMIT 10;
SELECT * FROM received.sa_ways_int LIMIT 10;

The code for this step is not included as it is basically the same as the PfB code, and is actually quite long. However, it can be examined through the Rmd file for this R Notebook.

One additional value that I was considering on adding is slope, however I have not gone through with the complete implementation of the variable yet. This would also affect step 6.

6. Calculate stress

The same as step 5, this step considers mainly SQL queries already performed by PfB. It will mainly alter the columns meant to host the stress rank for segments and intersections. It considers different cases to do the classification. The scripts that can be further examined on the Rmd file are:

> motorway trunk
> higher order
> lower order
> living street
> track
> path
> one way reset
> motorway trunk intersection
> primary intersection
> secondary intersection
> tertiary intersection
> lower intersection

7. Build network

On this step the network is built by creating two tables: vertices and links. As the last 2 steps, the code won’t be include but can be analyzed on the Rmd file.

8. Generate population grid

So, this is one of the main differences regarding the PfB approach and mine. Instead of using US census blocks I used a population grid of 1 km2 for the entire European territory. Since its area is quite big, I created a subdivision code to split the data, considering partial populations for each new cell depending on the mother cell. To do this I followed two steps:

- Download data from EUROSTAT and load into DB

## Download data and load to PostgreSQL
if (!dbExistsTable(connection, c("received","geostat"))){
  
  # CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
  cd <- getwd()
  ifelse(
    !file.exists(file.path(cd,'temp')),
    dir.create(file.path(cd,'temp')), 
    "Directory already exists"
  )
  
  # ESTABLISH THE NAME OF THE FILE WHERE THE GEOSTAT DATA WILL BE DOWNLOADED AND UNZIPPED
  geostat_file <- file.path(cd,'temp','geostat.zip')
  geostat_exdir <- file.path(cd,"temp","geostat")
  
  if (!file.exists(geostat_exdir)){
    # DEFINE THE URL FROM WHERE THE DATA COMES
  
    geostat_url <- 
      "https://ec.europa.eu/eurostat/cache/GISCO/geodatafiles/GEOSTAT-grid-POP-1K-2011-V2-0-1.zip"
    
    # DOWNLOAD THE FILE, UNZIP IT AND DELETE .ZIP
    
    library(utils)
    download.file(url = geostat_url, destfile = geostat_file)
    unzip(geostat_file, exdir = geostat_exdir)
    file.remove(geostat_file)
  }
  
  # CALL DATA INTO R AND REPROJECT
  library(sf)
  
  table_path <- file.path(
    geostat_exdir,
    "Version 2_0_1/GEOSTAT_grid_POP_1K_2011_V2_0_1.csv"
  )
  
  grid_path <- file.path(
    geostat_exdir,
    "Version 2_0_1/GEOSTATReferenceGrid/Grid_ETRS89_LAEA_1K-ref_GEOSTAT_POP_2011_V2_0_1.shp"
  )
  
  pop_table <- st_read(table_path)
  names(pop_table) <- pop_table %>% names() %>% tolower()
  
  pop_grid <- st_read(grid_path)
  pop_grid_t <- pop_grid %>% st_transform(crs = sa_crs)
  names(pop_grid_t) <- pop_grid_t %>% names() %>% tolower()
  
  # LOAD TO POSTGRESQL
  library(sqldf)
  sqldf(
    "
  DROP TABLE IF EXISTS received.pop_grid;
  DROP TABLE IF EXISTS received.pop_table;
    ",
  connection = connection
  )
  
  dbWriteTable(
    conn = connection,
    name = c("received","pop_grid"),
    value = pop_grid_t
  )
  
  dbWriteTable(
    conn = connection,
    name = c("received","pop_table"),
    value = pop_table
  )
  
  #### Join tables on data base and extract study area
  
  sqldf(
    "
-- Create join between .csv and .shp
DROP TABLE IF EXISTS received.geostat;
DROP INDEX IF EXISTS received.geostat_geom_idx;
CREATE TABLE received.geostat AS
 SELECT grid.grd_id, grid.geometry, tab.tot_p, tab.cntr_code, tab.year, tab.tot_p_con_dt
    FROM received.pop_grid grid, received.pop_table tab
    WHERE grid.grd_id = tab.grd_id;
CREATE INDEX geostat_geom_idx
  ON received.geostat
  USING gist
  (geometry);
  
DROP TABLE IF EXISTS received.pop_grid;
DROP TABLE IF EXISTS received.pop_table;
    ",
    connection = connection
  )
} else {
  "GEOSTAT data already loaded to database."
}
[1] "GEOSTAT data already loaded to database."
Warning message:
In postgresqlExecStatement(conn, statement, ...) :
  RS-DBI driver warning: (unrecognized PostgreSQL field type geometry (id:56267) in column 5)

- Generate subdivision with a grid, adding partial population and unique ID

sqldf::sqldf(
  "
DROP TABLE IF EXISTS received.sa_geostat;
DROP INDEX IF EXISTS received.sa_geostat_geom_idx;
-- Extract the grids concerning only the study area
CREATE TABLE received.sa_geostat AS
    SELECT  DISTINCT geo.grd_id, 
            CAST(geo.tot_p AS INTEGER), 
            geo.cntr_code, 
            geo.geometry
    FROM received.geostat geo, received.sa_ways w
    WHERE ST_Intersects(geo.geometry, w.geom);
CREATE INDEX sa_geostat_geom_idx
  ON received.sa_geostat
  USING gist
  (geometry);  
  ",
  connection = connection 
)
NOTICE:  index "sa_geostat_geom_idx" does not exist, skipping
## Establish a function to create grid with different number of subdivisions, defaults to 9
grid <- function(s = 9){
  ## Call it as an sf object and then transform it to CRS:3035 to create grid
  library(sf)
  library(dplyr, quietly = TRUE)
  
  sa_pop_1km2 <- st_read(
    dsn = connection,
    layer = c("received", "sa_geostat")
  ) %>% 
    st_transform(crs = 3035)
  
  ## Determine number of horizontal and vertical cells
  h <- as.integer(as.numeric(diff(st_bbox(sa_pop_1km2)[c(1, 3)]))/1000)
  v <- as.integer(as.numeric(diff(st_bbox(sa_pop_1km2)[c(2, 4)]))/1000)
  
  ## Make grid
  grid <- sa_pop_1km2 %>% 
    st_make_grid(n=c(h*sqrt(s),v*sqrt(s)), what = "polygons") %>%
    st_sf() %>% 
    mutate(id = 1:n()) %>% 
    st_intersection(sa_pop_1km2)
  
  ## Filter grid by area of intersection because there are small polygons created.
  
  grid$area <- grid %>% st_geometry() %>% st_area() %>% as.numeric()
  
  grid <- grid %>% filter(area > 1)
  
  grid$area <- NULL
  
  grid <- within(grid, cell_id <- paste(grd_id,"C",id, sep = ""))
  
  grid$id <- NULL
  
  grid$partial_p <- grid$tot_p/s
  
  grid %>% st_transform(crs = sa_crs)
}
sa_grid <- grid(s = subdivisions) # Always consider a squared number to make an even division

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
sqldf::sqldf(
  "DROP TABLE IF EXISTS generated.sa_pop_grid",
  connection = connection
)
## Load data into data base
RPostgreSQL::dbWriteTable(
  conn = connection,
  name = c("generated","sa_pop_grid"),
  value = sa_grid
)
[1] TRUE
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
qtm(
  shp = sa_grid, 
  fill = NULL, 
  borders = "red", 
  basemaps = "OpenStreetMap"
)

Plotting the grid on this step can allow the analyst decide on a better number of subdivisions, depending on the study area. I hope to automatize this on a later effort.

- Prepare the population grid table

This step is only generating new columns on my new Population Grid table. It follows the same logic as the PfB and therefore won’t be inlcuded on this document explicitely.

9. Reachable roads scripts

This is the core of the whole BNA analysis, where the actual network analysis is performed. This step might take some computation time. It is again the same as PfB, and can be reviewed with more detail on the Rmd file. It basically uses pgrouting, therefore the Dijkstra algorithm to compute the driving distance considering the configuration established on step 7. It does it for the two levels of traffic stress:

> High stress
> Low stress

10. Establish connected population grids and compute their accessibility

On this step basically four procedures take place:

- Connect population grids

Where a new table sa_connected_pop_grid is created to summarize the connected cells by establishing them as source and target, including if they are connected by the low or high stress network, and obtaining the minimum the costs between cells.

- Compute population access

The access computation on this step fills up the sa_pop_grid table created on step 8, according to the PfB methodology.

To compute access on this an the next step, a weighting procedure is used, as the methodology of PfB does, which can be accessed here.

A quick glance of the weights used, mainly for step 11:

Scoring Category Measure
People = 15 Population = N/A
Opportunity = 20 Employment = 35
K-12 Education = 35
Technical/vocational school = 10
Higher Education = 20
Core Services = 20 Doctor offices/clinics = 20
Dentist offices = 10
Hospitals = 20
Pharmacies = 10
Supermarkets = 25
Social services = 15
Recreation = 15 Parks = 40
Recreational trails = 35
Community centers = 25
Retail = 15 Retail shopping = N/A
Transit = 15 Station/transit centers = N/A

It is important to note that this reproduction of the BNA for Europe does not include employment data, as until now, I have not located a source to provide this information as open data for the whole Europe. Therefore, the final results will show this category but with 0 or NA values.

- Extract common destinations

Which uses the osm polygons and points generated by osm2pgsql. The destinations included are:

> Colleges
> Community centers
> Dentists
> Doctors
> Hospitals
> Parks
> Pharmacies
> Retail
> Schools
> Social services
> Supermarkets
> Transit
> Universities

- Compute access to common destinations

Where the access to the destinations established before is computed. Access to recreational trails and bike paths is also included.

Once again, on this step I do not include the SQL codes, however they can be accessed through the Rmd file.

11. Compute overall access

During this step the overall access is computed for each population grid, meaning that we can already observe the BNA score spatial behavior within our study area.

12. Compute overall score for the whole study area

For this step a new table is generated in the database sa_score_inputs to store the preliminary results. The code can be accessed on the Rmd file.

Results

The overall results obtained include the final score for the whole city, as well as the score per destination category. The total population and stress network is also calculated. The results can be observed on the following table.

Score/Value
Overall Score 72.41
Population 141307
Length of Low Stress Network (km) 1604.3
Length of High Stress Network (km) 243.9
People
Total People 76.81
Opportunity
Employment 0
K-12 Education 80.97
Technical/vocational school 78.19
Higher Education 76.45
Total Opportunity 51.45
Core Services
Doctor offices/clinics 79.67
Dentist offices 76.24
Hospitals 68.47
Pharmacies 74.61
Supermarkets 85.05
Social services 82
Total Core Services 78.28
Retail
Total Retail shopping 79.26
Recreation
Parks 83.87
Recreational trails 93.65
Community centers 71.69
Total Recreation 84.25
Transit
Total Transit 69.42

We can plot the results to have a quick view of the output, including the high and low stress network in an interactive way.

library(sf)
bna_score <- st_read(
  dsn = connection,
  layer = c("generated","sa_pop_grid")
)
stress_network <- st_read(
  dsn = connection,
  query = "SELECT ft_seg_stress, tf_seg_stress, geom FROM received.sa_ways"
)
bna_pal <- c("#FC7151","#DC7E6A","#C98875","#C08B83","#AD9396",
             "#9C9A9F","#929EAC","#78AAC5","#6FADCB","#49BFE6")
bna_breaks <- c(6,12,18,24,30,36,42,48,54,100)
stress_network$ft_stress <- ifelse(ways$ft_seg_stress == 1,"low stress","high stress")
stress_network$tf_stress <- ifelse(ways$tf_seg_stress == 1,"low stress","high stress")
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
int_map <- 
  tmap::tmap_leaflet(
     tmap::tm_view(
     basemaps = c(
       "CartoDB.Positron",
       "CartoDB.DarkMatter",
       "OpenStreetMap.Mapnik"
     )
   ) +
     tmap::tm_shape(bna_score) +
     tmap::tm_polygons(
       col = "overall_score",
       style = "fixed",
       breaks = bna_breaks,
       palette = bna_pal,
       alpha = 0.8,
       title = "BNA score",
       border.col = NULL,
       colorNA = NULL,
       showNA = FALSE
      ) +
     tmap::tm_shape(stress_network) +
     tmap::tm_lines(
       col = "ft_stress", 
       colorNA = NULL,
       showNA = FALSE,
       palette = c("firebrick1", "deepskyblue3"),
       title.col = "Stress network"
      ) +
     tmap::tm_shape(stress_network) +
     tmap::tm_lines(
       col = "tf_stress", 
       colorNA = NULL,
       showNA = FALSE,
       palette = c("firebrick1", "deepskyblue3"),
       legend.col.show = FALSE
      )
  )
int_map

Observations

  • The total time that this particular city took to compute its BNA, including plots, overpass download, but without GEOSTAT data download on system, upload on file, and processing on database was 29.59 minutes. Adding the GEOSTAT proccessing to the workflow adds around 5 minutes.

  • What can be observd for the whole analysis is that the resulting BNA score is highly influenced by the fact that the job/employment data is not available. However, this was an attempt to reproduce the score as close as possible as PfB apply their methodology, just to explore its reproducibility.

  • My plan next is to exclude this variable from the BNA score computation, and perhaps include some other variables that would suit the European context better.

  • My final goal for the moment is to try to validate the scoring methodology for Europe. I picked a city in the UK as I know there is Origin-Destination data available that could be used as a validation method.

LS0tDQp0aXRsZTogIkJOQSBzY29yZSBmb3IgRXVyb3BlIg0Kc3VidGl0bGU6IEFuIGF0dGVtcHQgdG8gcmVwcm9kdWNlIHRoZSBQZW9wbGUgZm9yIEJpa2VzIEJOQSBzY29yZQ0KYXV0aG9yOiBMb3JlbmEgQWJhZA0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0aGVtZTogam91cm5hbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGRmX3ByaW50OiB0aWJibGUNCi0tLQ0KVGhlIGNvZGVzIGJlbG93IHdpbGwgYWxsb3cgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBbQk5BIHNjb3JlXShodHRwczovL2JuYS5wZW9wbGVmb3JiaWtlcy5vcmcvIy8pIGZvciBhbnkgY2l0eSBpbiBFdXJvcGUuIFRoZSBjb2RpbmcgbGFuZ3VhZ2VzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIFIgYW5kIFNRTCwgd2l0aCBhIGZldyBsaW5lcyBwYXNzZWQgb250byB0aGUgQ29tbWFuZCBQcm9tcHQuDQoNCiMgQ2FzZSBzdHVkeTogQ2FtYnJpZGdlLCBVSyB7LnRhYnNldH0NCg0KIyMgV29ya2Zsb3cgc3RlcCBieSBzdGVwIA0KDQojIyMgMS4gRXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBQb3N0Z3JlU1FMIHNlcnZlciBhbmQgZXN0YWJsaXNoIGJhc2ljIHBhcmFtZXRlcnMgb2YgYW5hbHlzaXMuDQoNCldpdGhpbiB0aGlzIHN0ZXAsIHRocmVlIG1ham9yIHRoaW5ncyBhcmUgcGVyZm9ybWVkLCBhc3N1bWluZyB0aGF0IHRoZSB1c2VyIGhhcyBjcmVhdGVkIGEgZGF0YWJhc2Ugb24gaXRzIFBvc3RncmVTUUwuIFRvIHRlc3QgY29ubmVjaXRvbiBhbiBlbXB0eSB0YWJsZSBvbiB0aGUgZGF0YWJhc2UgY2FsbGVkICJ0ZXN0IiB3YXMgY3JlYXRlZCBvbiB0aGUgcHVibGljIHNjaGVtYS4NCg0KIyMjIyAtIENyZWF0ZSBjb25uZWN0aW9uIGFuZCB0ZXN0IGl0DQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCnN0YXJ0IDwtIFN5cy50aW1lKCkNCmBgYA0KDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9DQpkYl9uYW1lID0gImJuYV9ldXJvcGUiDQpsb2NhbF9ob3N0ID0gImxvY2FsaG9zdCINCnBvcnRfbnVtID0gNTQzMg0KdXNlcl9uYW1lID0gInBvc3RncmVzIg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgaW5jbHVkZSA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRX0NCmxpYnJhcnkoUlBvc3RncmVTUUwpDQoNCiMgTE9BRCBQT1NUR1JFU1FMIERSSVZFUg0KZHJpdmVyIDwtIGRiRHJpdmVyKCJQb3N0Z3JlU1FMIikNCiMgQ1JFQVRFIENPTk5FQ1RJT04gVE8gVEhFIFBPU1RHUkVTUUwgREFUQUJBU0UNCiMgVEhFIENPTk5FQ1RJT04gVkFSSUFCTEUgV0lMTCBCRSBVU0VEIEZPUiBBTEwgRlVSVEhFUiBPUEVSQVRJT05TDQpjb25uZWN0aW9uIDwtIGRiQ29ubmVjdCgNCiAgZHJpdmVyLCANCiAgZGJuYW1lID0gZGJfbmFtZSwNCiAgaG9zdCA9IGxvY2FsX2hvc3QsIA0KICBwb3J0ID0gcG9ydF9udW0sDQogIHVzZXIgPSB1c2VyX25hbWUsIA0KICBwYXNzd29yZCA9IHJzdHVkaW9hcGk6OmFza0ZvclBhc3N3b3JkKCJEYXRhYmFzZSBwYXNzd29yZCIpDQopDQoNCmlmZWxzZSgNCiAgIWRiRXhpc3RzVGFibGUoY29ubmVjdGlvbiwgInRlc3QiKSwNCiAgIlRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSB3YXMgbm90IHBvc3NpYmxlLiIsDQogICJUaGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2Ugd2FzIHN1Y2Nlc3NmdWwhIg0KKQ0KDQojIERJU0NPTk5FQ1Q6IEltcG9ydGFudCB3aGVuIG1vZGlmeWluZyB0aGUgZGF0YWJhc2Ugb24gcGdhZG1pbjQNCiMgZGJEaXNjb25uZWN0KGNvbm5lY3Rpb24pDQpgYGANCg0KIyMjIyAtIFNldCB1cCBkYXRhYmFzZQ0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgZWNobyA9IFRSVUV9DQpDUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgaHN0b3JlOw0KQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBvc3RnaXM7DQpDUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgcGdyb3V0aW5nOw0KQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTIGRlc3RpbmF0aW9uczsNCkNSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyBnZW5lcmF0ZWQ7DQpDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgcmVjZWl2ZWQ7DQpgYGANCg0KIyMjIyAtIEVzdGFibGlzaCBTdHVkeSBBcmVhIGFuZCBvdGhlciBpbXBvcnRhbnQgdmFyaWFibGVzDQoNCk5vdCBvbmx5IHRoZSBuYW1lIG9mIHRoZSBzdHVkeSBhcmVhIHNob3VsZCBiZSBlc3RhYmxpc2hlZCwgYnV0IGFsc28gdGhlIG51bWJlciBvZiBzdWJkaXZpc2lvbnMgZm9yIHRoZSBncmlkLCB0aGUgY29vcmRpbmF0ZSByZWZlcmVuY2Ugc3lzdGVtIHRvIHdvcmsgd2l0aCwgYW5kIHRoZSBiaWtpbmcgZGlzdGFuY2UgdGhhdCB3aWxsIGJlIGFzc3VtZWQgZm9yIHRoZSBjb25uZWN0aXZpdHkgYW5hbHlzaXMuIA0KDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0Kc2FfbmFtZSA9ICJDYW1icmlkZ2UiDQpzdWJkaXZpc2lvbnMgPSA0DQpzYV9jcnMgPSAzODU3DQpiaWtpbmdfZGlzdGFuY2UgPSAzMDAwICMjIGluIG1ldGVycw0KcGFzdGUoIllvdSBhcmUgcnVubmluZyB0aGUgQk5BIHNjb3JlIGZvciIsIHNhX25hbWUsICJ3aXRoaW4gYSBiaWtpbmcgZGlzdGFuY2Ugb2YiLCBiaWtpbmdfZGlzdGFuY2UvMTAwMCwgImttLiIpDQpgYGANCg0KIyMjIDIuIE9idGFpbiBzdHVkeSBhcmVhIGJvdW5kYXJ5IHdpdGggYG9zbWRhdGFgLg0KDQpFeHRyYWN0IHRoZSBzdHVkeSBhcmVhIGJvdW5kYXJ5IGNvbnNpZGVyaW5nIGEgYnVmZmVyIG9mIGhhbGYgdGhlIGJpa2luZyBkaXN0YW5jZSBlc3RhYmxpc2hlZC4gDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgaW5jbHVkZSA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRX0NCiMgRlVOQ1RJT04gVE8gRVhUUkFDVCBTVFVEWSBBUkVBIEJPVU5EQVJZIFdJVEggT1NNIEFORCBXUklURSBJVCBUTyBUSEUgREFUQUJBU0UNCnNhX2JiIDwtIGZ1bmN0aW9uIChzdHVkeV9hcmVhLCBkaXN0LCBjcnMsIGNvbm4pew0KICAjIEdFVCBEQVRBIEZST00gT1NNDQogIGxpYnJhcnkob3NtZGF0YSkNCiAgbGlicmFyeShzZikNCiAgc3R1ZHlfYXJlYV9iYiA8LSBzdHVkeV9hcmVhICU+JSANCiAgICBnZXRiYihmb3JtYXRfb3V0ID0gInNmX3BvbHlnb24iKSAlPiUNCiAgICBzdF90cmFuc2Zvcm0oY3JzID0gY3JzKQ0KICANCiAgIyMgQUREIEEgQlVGRkVSIFRPIFRIRSBCT1VOREFSWQ0KICBzdHVkeV9hcmVhX2JiIDwtc3R1ZHlfYXJlYV9iYiAlPiUgDQogICAgc3RfYnVmZmVyKGRpc3QgPSAwLjUqZGlzdCkNCiAgDQogICMgREVMRVRFIEVYSVNUSU5HIEJPVU5EQVJZDQogIGxpYnJhcnkoc3FsZGYpDQogIHNxbGRmKA0KICAgICJEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9ib3VuZGFyeSIsDQogICAgY29ubmVjdGlvbiA9IGNvbm4NCiAgKQ0KDQogICMgVVBMT0FEIEJPVU5EQVJZIFRPIFBPU1RHUkVTUUwgREFUQUJBU0UNCiAgbGlicmFyeShSUG9zdGdyZVNRTCkNCiAgZGJXcml0ZVRhYmxlKGNvbm4sIGMoInJlY2VpdmVkIiwic2FfYm91bmRhcnkiKSwgc3R1ZHlfYXJlYV9iYikNCiAgDQogIHN0dWR5X2FyZWFfYmINCn0NCg0KYm91bmRhcnkgPC0gc2FfYmIoDQogIHN0dWR5X2FyZWEgPSBzYV9uYW1lLCANCiAgZGlzdCA9IGJpa2luZ19kaXN0YW5jZSwNCiAgY3JzID0gc2FfY3JzLCANCiAgY29ubiA9IGNvbm5lY3Rpb24NCikNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodD0gOCwgZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRX0NCmxpYnJhcnkodG1hcCkNCnRtYXBfbW9kZSgidmlldyIpDQpxdG0oDQogIHNocCA9IGJvdW5kYXJ5LCANCiAgZmlsbCA9IE5VTEwsIA0KICBib3JkZXJzID0gInJlZCIsIA0KICBiYXNlbWFwcyA9ICJPcGVuU3RyZWV0TWFwIg0KKQ0KYGBgDQoNCiMjIyAzLiBPYnRhaW4gdGhlIGAub3NtYCBmaWxlIGZyb20gKipPdmVycGFzcyBBUEkqKg0KDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KIyBGVU5DVElPTiBUTyBET1dOTE9BRCBPU00gREFUQSBXSVRIIFRIRSBPVkVSUEFTUyBBUEkgDQpzYV9kb3dubG9hZCA8LSBmdW5jdGlvbihjb25uKXsNCiAgIyBPQlRBSU4gVEhFIEVYVEVOVCBPRiBUSEUgU1RVRFkgQVJFQSBBUyBBIEJPVU5ESU5HIEJPWA0KICBzYV9leHRlbnQgPC0gZGJHZXRRdWVyeShjb25uLA0KICAgICAgICAiU0VMRUNUDQogICAgICAgIFNUX0V4dGVudCgoU1RfVHJhbnNmb3JtKGdlb21ldHJ5LDQzMjYpKSkNCiAgICAgICAgRlJPTSByZWNlaXZlZC5zYV9ib3VuZGFyeSIpIA0KICANCiAgbGlicmFyeShzdHJpbmdyKQ0KICBzYV9jb29yZCA8LSB0b1N0cmluZyhzYV9leHRlbnQpICU+JSANCiAgICBzdHJfZXh0cmFjdF9hbGwoIlxcLSpcXGQrXFwuKlxcZCoiKSAlPiUgDQogICAgdW5saXN0KCkgJT4lIA0KICAgIHRvU3RyaW5nKCkNCiAgICANCiAgIyBDT05TVFJVQ1QgVEhFIEFQSSBMSU5FIFRPIFJFUVVFU1QgVEhFIERBVEENCiAgYXBpIDwtIHBhc3RlKA0KICAgICdodHRwczovL292ZXJwYXNzLWFwaS5kZS9hcGkvbWFwP2Jib3g9JywNCiAgICBzYV9jb29yZCwNCiAgICBzZXAgPSAnJw0KICApDQogIA0KICAjIENSRUFURSBBIE5FVyBURU1QT1JBTCBESVJFQ1RPUlkgVE8gRE9XTkxPQUQgVEhFIElORk8NCiAgY2QgPC0gZ2V0d2QoKQ0KICBpZmVsc2UoDQogICAgIWZpbGUuZXhpc3RzKGZpbGUucGF0aChjZCwndGVtcCcpKSwNCiAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChjZCwndGVtcCcpKSwgDQogICAgIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyINCiAgKQ0KICANCiAgIyBFU1RBQkxJU0ggVEhFIE5BTUUgT0YgVEhFIEZJTEUgV0hFUkUgVEhFIE9WRVJQQVNTIEFQSSBXSUxMIERPV05MT0FEIElUUyBEQVRBDQogIG9zbV9maWxlIDwtIGZpbGUucGF0aChjZCwndGVtcCcsJ292ZXJwYXNzLm9zbScpDQogIA0KICAjIFJFUVVFU1QgVEhFIERBVEEgRlJPTSBUSEUgQVBJDQogIGxpYnJhcnkodXRpbHMpDQogIGRvd25sb2FkLmZpbGUodXJsID0gYXBpLCBkZXN0ZmlsZSA9IG9zbV9maWxlLCBleHRyYSA9ICctbnYgLU8nKSANCiAgDQogIGlmZWxzZSgNCiAgICBmaWxlLmV4aXN0cyhmaWxlLnBhdGgoY2QsJ3RlbXAnLCdvdmVycGFzcy5vc20nKSksDQogICAgIk9NUyBkYXRhIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkISIsDQogICAgIk9TTSBkYXRhIHdhcyBub3QgZG93bmxvYWRlZCwgcGxlYXNlIHRyeSBhZ2FpbiBvciBkb3dubG9hZCBtYW51YWxseS4iDQogICkNCiAgDQp9DQoNCiMgRE9XTkxPQUQgVEhFIERBVEEgRlJPTSBPU00gV0lUSCBPVkVSUEFTUyBBUEkNCnNhX2Rvd25sb2FkKGNvbm4gPSBjb25uZWN0aW9uKQ0KYGBgDQoNCiMjIyA0LiBMb2FkIGRhdGEgaW50byB0aGUgUG9zdGdyZVNRTCBkYXRhYmFzZS4gDQoNCiMjIyMgLSBPYnRhaW4gY29uZmlndXJhdGlvbiBmaWxlcw0KDQpgYGB7ciwgY29sbGFwc2UgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0V9DQojIENSRUFURSBBIE5FVyBURU1QT1JBTCBESVJFQ1RPUlkgVE8gRE9XTkxPQUQgVEhFIElORk8NCmNkIDwtIGdldHdkKCkNCmlmZWxzZSgNCiAgIWZpbGUuZXhpc3RzKGZpbGUucGF0aChjZCwndGVtcCcpKSwNCiAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoY2QsJ3RlbXAnKSksIA0KICAiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIg0KKQ0KDQojIEVTVEFCTElTSCBUSEUgTkFNRSBPRiBUSEUgRklMRVMgDQpwZmJzdHlsZV9maWxlIDwtIGZpbGUucGF0aChjZCwndGVtcCcsJ3BmYi5zdHlsZScpDQptYXBjb25maWdfZmlsZSA8LSBmaWxlLnBhdGgoY2QsInRlbXAiLCJtYXBjb25maWcueG1sIikNCm1hcGNvbmZpZ2Jpa2VzX2ZpbGUgPC0gZmlsZS5wYXRoKGNkLCJ0ZW1wIiwibWFwY29uZmlnX2Zvcl9iaWN5Y2xlcy54bWwiKQ0KDQojIENIRUNLIElGIFRIRVkgQVJFIERPV05MT0FERUQNCmlmKA0KICBmaWxlLmV4aXN0cyhmaWxlLnBhdGgocGZic3R5bGVfZmlsZSkpICYgDQogIGZpbGUuZXhpc3RzKGZpbGUucGF0aChtYXBjb25maWdfZmlsZSkpICYNCiAgZmlsZS5leGlzdHMoZmlsZS5wYXRoKG1hcGNvbmZpZ2Jpa2VzX2ZpbGUpKQ0KKXsNCiAgIkZpbGVzIGFyZSBhbHJlYWR5IGRvd25sb2FkZWQhIg0KfSBlbHNlIHsNCiAjIEVTVEFCTElTSCBUSEUgVVJMUw0KICBwZmJzdHlsZV91cmwgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hemF2ZWEvcGZiLW5ldHdvcmstY29ubmVjdGl2aXR5L2RldmVsb3Avc3JjL2FuYWx5c2lzL2ltcG9ydC9wZmIuc3R5bGUiDQogIA0KICBtYXBjb25maWdfdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGdSb3V0aW5nL29zbTJwZ3JvdXRpbmcvbWFzdGVyL21hcGNvbmZpZy54bWwiDQogIA0KICBtYXBjb25maWdiaWtlc191cmwgPC0gDQogICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGdSb3V0aW5nL29zbTJwZ3JvdXRpbmcvbWFzdGVyL21hcGNvbmZpZ19mb3JfYmljeWNsZXMueG1sIg0KICANCiAgIyBSRVFVRVNUIFRIRSBEQVRBDQogIGxpYnJhcnkodXRpbHMpDQogIGRvd25sb2FkLmZpbGUodXJsID0gcGZic3R5bGVfdXJsLCBkZXN0ZmlsZSA9IHBmYnN0eWxlX2ZpbGUpDQogIGRvd25sb2FkLmZpbGUodXJsID0gbWFwY29uZmlnX3VybCwgZGVzdGZpbGUgPSBtYXBjb25maWdfZmlsZSkNCiAgZG93bmxvYWQuZmlsZSh1cmwgPSBtYXBjb25maWdiaWtlc191cmwsIGRlc3RmaWxlID0gbWFwY29uZmlnYmlrZXNfZmlsZSkgDQp9DQpgYGANCg0KDQojIyMjIC0gTG9hZCBkYXRhIHdpdGggYG9zbTJwZ3NxbGAgYW5kIGBvc20ycGdyb3V0aW5nYA0KDQoqKk5PVEU6KiogVG8gcnVuIHRoaXMgY29tbWFuZCBjcmVhdGUgYSBwYXNzd29yZCBmaWxlIG9uICVBUFBEQVRBJS9wb3N0Z3Jlc3FsL3BncGFzcy5jb25mIHdpdGggdGhlIGZvcm1hdCBob3N0bmFtZTpwb3J0OmRhdGFiYXNlOnVzZXJuYW1lOnBhc3N3b3JkDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdzcWwgLWMgLWQgYm5hX2V1cm9wZSAtVSBwb3N0Z3JlcyAtSCBsb2NhbGhvc3QgLVcgLS1jcmVhdGUgLS1wcmVmaXggc2FfZnVsbCAtUyBFOi9HZW9UZWNoL1RoZXNpcy9UaGVzaXNfUl9Qcm9qZWN0L3RlbXAvcGZiLnN0eWxlIEU6L0dlb1RlY2gvVGhlc2lzL1RoZXNpc19SX1Byb2plY3QvdGVtcC9vdmVycGFzcy5vc20gLS1jYWNoZSA2MDAiLA0KICBzaG93Lm91dHB1dC5vbi5jb25zb2xlID0gVFJVRQ0KICApDQoNCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdyb3V0aW5nIC1mIEU6L0dlb1RlY2gvVGhlc2lzL1RoZXNpc19SX1Byb2plY3QvdGVtcC9vdmVycGFzcy5vc20gLWggbG9jYWxob3N0IC1kIGJuYV9ldXJvcGUgLS11c2VybmFtZSBwb3N0Z3JlcyAtLXNjaGVtYSByZWNlaXZlZCAtLXByZWZpeCBzYV9hbGxfIC0tY29uZiBFOi9HZW9UZWNoL1RoZXNpcy9UaGVzaXNfUl9Qcm9qZWN0L3RlbXAvbWFwY29uZmlnLnhtbCAtLWNsZWFuIiwNCiAgc2hvdy5vdXRwdXQub24uY29uc29sZSA9IFRSVUUNCikNCg0Kc3lzdGVtKA0KICBjb21tYW5kID0gIm9zbTJwZ3JvdXRpbmcgLWYgRTovR2VvVGVjaC9UaGVzaXMvVGhlc2lzX1JfUHJvamVjdC90ZW1wL292ZXJwYXNzLm9zbSAtaCBsb2NhbGhvc3QgIC1kIGJuYV9ldXJvcGUgLS11c2VybmFtZSBwb3N0Z3JlcyAtLXNjaGVtYSByZWNlaXZlZCAtLXByZWZpeCBzYV9iaWtlXyAtLWNvbmYgRTovR2VvVGVjaC9UaGVzaXMvVGhlc2lzX1JfUHJvamVjdC90ZW1wL21hcGNvbmZpZ19mb3JfYmljeWNsZXMueG1sIC0tY2xlYW4iLA0KICBzaG93Lm91dHB1dC5vbi5jb25zb2xlID0gVFJVRQ0KKQ0KYGBgDQoNClJlcGxhY2UgdmFyaWFibGVzIGJldHdlZW4gYCVgOg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIGV2YWwgPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRX0NCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdzcWwgLWMgLWQgJURCTkFNRSUgLVUgJVVTRVJOQU1FJSAtSCAlSE9TVE5BTUUlIC1XIC0tY3JlYXRlIC0tcHJlZml4IHNhX2Z1bGwgLVMgJUNVUlJFTlRESVJFQ1RPUlkvdGVtcC9wZmIuc3R5bGUlICVDVVJSRU5URElSRUNUT1JZL3RlbXAvb3ZlcnBhc3Mub3NtJSAtLWNhY2hlIDYwMCIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQogICkNCg0Kc3lzdGVtKA0KICBjb21tYW5kID0gIm9zbTJwZ3JvdXRpbmcgLWYgJUNVUlJFTlRESVJFQ1RPUlkvdGVtcC9vdmVycGFzcy5vc20lIC1oICVIT1NUTkFNRSUgLS1wYXNzd29yZCAlREJQQVNTV09SRCUgLWQgJURCTkFNRSUgLS11c2VybmFtZSAlVVNFUk5BTUUlIC0tc2NoZW1hIHJlY2VpdmVkIC0tcHJlZml4IHNhX2FsbF8gLS1jb25mICVDVVJSRU5URElSRUNUT1JZL3RlbXAvbWFwY29uZmlnLnhtbCUgLS1jbGVhbiIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQopDQoNCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdyb3V0aW5nIC1mICVDVVJSRU5URElSRUNUT1JZL3RlbXAvb3ZlcnBhc3Mub3NtJSAtaCAlSE9TVE5BTUUlIC0tcGFzc3dvcmQgJURCUEFTU1dPUkQlIC1kICVEQk5BTUUlIC0tdXNlcm5hbWUgJVVTRVJOQU1FJSAtLXNjaGVtYSByZWNlaXZlZCAtLXByZWZpeCBzYV9iaWtlXyAtLWNvbmYgJUNVUlJFTlRESVJFQ1RPUlkvdGVtcC9tYXBjb25maWdfZm9yX2JpY3ljbGVzLnhtbCUgLS1jbGVhbiIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQopDQpgYGANCg0KIyMjIDUuIE9yZ2FuaXplIGFuZCBwcmVwYXJlIHRoZSBkYXRhYmFzZSANCg0KT24gdGhpcyBzdGVwLCBzZXZlcmFsIFNRTCBxdWVyaWVzIGFyZSBiZWluZyBydW4gdG8gb3JnYW5pemUgdGhlIHRhYmxlcywgY2xpcCB0aGVtIHRvIHRoZSBzdHVkeSBhcmVhIG91dGxpbmUsIG1lcmdlIGl0IHdpdGggdGhlICpvc20ycGdzcWwqIGRhdGEgYW1vbmcgb3RoZXIgdGhpbmdzLiBUaGUgc2NyaXB0cyBpbmNsdWRlIG1haW5seSB0aGUgY29kZSB0aGF0IFBmQiBhbHJlYWR5IHVzZXMsIGJ1dCB3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucyBsaWtlIGNoYW5naW5nIGZlZXQgdG8gbWV0ZXJzLCBtcGggdG8ga20vaCwgYW5kIG90aGVycy4gQmFzaWNhbGx5LCA0IHN0ZXBzIGFyZSB0YWtlbjoNCg0KIyMjIyAtIE9yZ2FuaXplIHRhYmxlcw0KDQpXaGljaCBkcm9wcyB1bnVzZWQgY29sdW1ucyBhbmQgcHJvamVjdHMgZGF0YSB0byB0aGUgYWxyZWFkeSBlc3RhYmxpc2hlZCBDUlMuIEl0IGFsc28gY2xlYW5zIHRoZSBkYXRhYmFzZSBmb3IgYSBuZXcgYW5hbHlzaXMgdG8gYmUgcnVuIGlmIHRoZSBzdHVkeSBhcmVhIGlzIGNoYW5nZWQgZm9yIGV4YW1wbGUuIA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQoNCi0tIE9SR0FOSVpFIE5FV0xZIENSRUFURUQgVEFCTEVTDQoNCi0tIGRlbGV0ZSBleGlzdGluZyB0YWJsZXMNCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9saW5lOw0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludDsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbjsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcm9hZHM7DQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzOw0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5c19pbnQ7DQoNCi0tIG1vdmUgdGFibGVzIHRvIHJlY2VpdmVkIHNjaGVtYQ0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHB1YmxpYy5zYV9mdWxsX2xpbmUgU0VUIFNDSEVNQSByZWNlaXZlZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuc2FfZnVsbF9wb2ludCBTRVQgU0NIRU1BIHJlY2VpdmVkOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHB1YmxpYy5zYV9mdWxsX3BvbHlnb24gU0VUIFNDSEVNQSByZWNlaXZlZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuc2FfZnVsbF9yb2FkcyBTRVQgU0NIRU1BIHJlY2VpdmVkOw0KDQotLSBkcm9wIHVudXNlZCB0YWJsZXMNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF9wb2ludHNvZmludGVyZXN0Ow0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYmlrZV9wb2ludHNvZmludGVyZXN0Ow0KDQotLSBkcm9wIHVudXNlZCBjb2x1bW5zDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRhZ19pZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgbGVuZ3RoOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBsZW5ndGhfbTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgeDE7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHkxOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyB4MjsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgeTI7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvc3Q7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJldmVyc2VfY29zdDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29zdF9zOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyByZXZlcnNlX2Nvc3RfczsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgcnVsZTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgbWF4c3BlZWRfZm9yd2FyZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgbWF4c3BlZWRfYmFja3dhcmQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHNvdXJjZV9vc207DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRhcmdldF9vc207DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHByaW9yaXR5Ow0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBvbmVfd2F5Ow0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBvbmV3YXk7DQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNudDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNoazsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVpbjsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVvdXQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBsb247DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBsYXQ7DQoNCi0tIGNoYW5nZSBjb2x1bW4gbmFtZXMNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgQ09MVU1OIGdpZCBUTyByb2FkX2lkOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIFJFTkFNRSBDT0xVTU4gdGhlX2dlb20gVE8gZ2VvbTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgQ09MVU1OIHNvdXJjZSBUTyBpbnRlcnNlY3Rpb25fZnJvbTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgQ09MVU1OIHRhcmdldCBUTyBpbnRlcnNlY3Rpb25fdG87DQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgUkVOQU1FIENPTFVNTiBpZCBUTyBpbnRfaWQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIFJFTkFNRSBDT0xVTU4gdGhlX2dlb20gVE8gZ2VvbTsNCg0KLS0gY2hhbmdlIG5hbWVzIG9mIHRhYmxlcw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIFJFTkFNRSBUTyBzYV93YXlzOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzX3ZlcnRpY2VzX3BnciBSRU5BTUUgVE8gIHNhX3dheXNfaW50Ow0KDQotLSBjcmVhdGUgbmV3IGNvbHVtbnMNCg0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ1bmN0aW9uYWxfY2xhc3MgVEVYVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBwYXRoX2lkIElOVEVHRVI7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc3BlZWRfbGltaXQgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIG9uZV93YXlfY2FyIFZBUkNIQVIoMik7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgb25lX3dheSBWQVJDSEFSKDIpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHdpZHRoIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9iaWtlX2luZnJhIFRFWFQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgZnRfYmlrZV9pbmZyYV93aWR0aCBGTE9BVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB0Zl9iaWtlX2luZnJhIFRFWFQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdGZfYmlrZV9pbmZyYV93aWR0aCBGTE9BVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9sYW5lcyBJTlQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdGZfbGFuZXMgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X2Nyb3NzX2xhbmVzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB0Zl9jcm9zc19sYW5lcyBJTlQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdHdsdGxfY3Jvc3NfbGFuZXMgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X3BhcmsgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX3BhcmsgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X3NlZ19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X2ludF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX3NlZ19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX2ludF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHh3YWxrIElOVDsNCg0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBsZWdzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX2ludCBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc2lnbmFsaXplZCBCT09MRUFOOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBzdG9wcyBCT09MRUFOOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBycmZiIEJPT0xFQU47DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGlzbGFuZCBCT09MRUFOOw0KDQotLSBpbmRleGVzDQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19vc207DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19pbnRfb3NtOw0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuaWR4X3NhX2FsbF9mdWxsd2F5czsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV9hbGxfZnVsbHBvaW50czsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19vc20gT04gcmVjZWl2ZWQuc2Ffd2F5cyAob3NtX2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19pbnRfb3NtIE9OIHJlY2VpdmVkLnNhX3dheXNfaW50IChvc21faWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV9hbGxfZnVsbHdheXMgT04gcmVjZWl2ZWQuc2FfZnVsbF9saW5lIChvc21faWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV9hbGxfZnVsbHBvaW50cyBPTiByZWNlaXZlZC5zYV9mdWxsX3BvaW50IChvc21faWQpOw0KDQpBTkFMWVpFIHJlY2VpdmVkLnNhX3dheXMgKG9zbV9pZCxnZW9tKTsNCkFOQUxZWkUgcmVjZWl2ZWQuc2FfYmlrZV93YXlzICh0aGVfZ2VvbSk7DQpBTkFMWVpFIHJlY2VpdmVkLnNhX3dheXNfaW50IChvc21faWQpOw0KQU5BTFlaRSByZWNlaXZlZC5zYV9mdWxsX2xpbmUgKG9zbV9pZCk7DQpBTkFMWVpFIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgKG9zbV9pZCk7DQoNCi0tIGFkZCBpbiBjeWNsZXdheSBkYXRhIHRoYXQgaXMgbWlzc2luZyBmcm9tIGZpcnN0IG9zbTJwZ3JvdXRpbmcgY2FsbA0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5cyAoDQogICAgbmFtZSwgaW50ZXJzZWN0aW9uX2Zyb20sIGludGVyc2VjdGlvbl90bywgb3NtX2lkLCBnZW9tDQopDQpTRUxFQ1QgIG5hbWUsDQogICAgICAgIChTRUxFQ1QgICAgIGkuaW50X2lkDQogICAgICAgIEZST00gICAgICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCiAgICAgICAgV0hFUkUgICAgICAgaS5nZW9tIDwjPiByZWNlaXZlZC5zYV9iaWtlX3dheXMudGhlX2dlb20gPCAyMA0KICAgICAgICBPUkRFUiBCWSAgICBTVF9EaXN0YW5jZShTVF9TdGFydFBvaW50KHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cy50aGVfZ2VvbSksaS5nZW9tKSBBU0MNCiAgICAgICAgTElNSVQgICAgICAgMSksDQogICAgICAgIChTRUxFQ1QgICAgIGkuaW50X2lkDQogICAgICAgIEZST00gICAgICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCiAgICAgICAgV0hFUkUgICAgICAgaS5nZW9tIDwjPiByZWNlaXZlZC5zYV9iaWtlX3dheXMudGhlX2dlb20gPCAyMA0KICAgICAgICBPUkRFUiBCWSAgICBTVF9EaXN0YW5jZShTVF9FbmRQb2ludChyZWNlaXZlZC5zYV9iaWtlX3dheXMudGhlX2dlb20pLGkuZ2VvbSkgQVNDDQogICAgICAgIExJTUlUICAgICAgIDEpLA0KICAgICAgICBvc21faWQsDQogICAgICAgIHRoZV9nZW9tDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cw0KV0hFUkUgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcyDQogICAgICAgICAgICBXSEVSRSAgIHcyLm9zbV9pZCA9IHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cy5vc21faWQNCik7DQoNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV93YXlzX2ludHNfc3RvcDsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV93YXlzX3JyZmI7DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19pc2xhbmQ7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfaW50c19zdG9wIE9OIHJlY2VpdmVkLnNhX3dheXNfaW50IChzaWduYWxpemVkLHN0b3BzKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19ycmZiIE9OIHJlY2VpdmVkLnNhX3dheXNfaW50IChycmZiKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19pc2xhbmQgT04gcmVjZWl2ZWQuc2Ffd2F5c19pbnQgKGlzbGFuZCk7DQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFMVEVSIENPTFVNTiBnZW9tIFRZUEUgZ2VvbWV0cnkobGluZXN0cmluZyw/c2FfY3JzKQ0KVVNJTkcgU1RfVHJhbnNmb3JtKGdlb20sP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYmlrZV93YXlzIEFMVEVSIENPTFVNTiB0aGVfZ2VvbSBUWVBFIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh0aGVfZ2VvbSw/c2FfY3JzKTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX2ludCBBTFRFUiBDT0xVTU4gZ2VvbSBUWVBFIGdlb21ldHJ5KHBvaW50LD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0oZ2VvbSw/c2FfY3JzKTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9mdWxsX2xpbmUgQUxURVIgQ09MVU1OIHdheSBUWVBFIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh3YXksP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBBTFRFUiBDT0xVTU4gd2F5IFRZUEUgZ2VvbWV0cnkocG9pbnQsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh3YXksP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uIEFMVEVSIENPTFVNTiB3YXkgVFlQRSBnZW9tZXRyeShwb2x5Z29uLD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0od2F5LD9zYV9jcnMpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcm9hZHMgQUxURVIgQ09MVU1OIHdheSBUWVBFIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh3YXksP3NhX2Nycyk7DQoNClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9yb2FkczsNCg0KYGBgDQoNCiMjIyMgLSBDbGlwIGRhdGEgaW50byBib3VuZGFyeQ0KDQpXaGljaCBjbGlwcyB0aGUgZGF0YSBpbnRvIHRoZSBib3VuZGFyeSBvZiB0aGUgc3R1ZHkgYXJlYSBzZWxlY3RlZC4NCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBEUk9QIENPTlNUUkFJTlQgSUYgRVhJU1RTIHNhX2FsbF93YXlzX3NvdXJjZV9ma2V5IENBU0NBREU7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBEUk9QIENPTlNUUkFJTlQgSUYgRVhJU1RTIHNhX2FsbF93YXlzX3RhcmdldF9ma2V5IENBU0NBREU7DQoNCkRFTEVURSBGUk9NIHJlY2VpdmVkLnNhX3dheXNfaW50IEFTIGludGVyc2VjdGlvbnMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKGludGVyc2VjdGlvbnMuZ2VvbSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV93YXlzIEFTIHdheXMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKHdheXMuZ2VvbSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX2xpbmUgQVMgbGluZXMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKGxpbmVzLndheSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX3BvaW50IEFTIHBvaW50cw0KICAgIFVTSU5HIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGJvdW5kYXJ5DQogICAgV0hFUkUgTk9UIFNUX0RXaXRoaW4ocG9pbnRzLndheSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24gQVMgcG9seWdvbnMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKHBvbHlnb25zLndheSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX3JvYWRzIEFTIHJvYWRzDQogICAgVVNJTkcgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYm91bmRhcnkNCiAgICBXSEVSRSBOT1QgU1RfRFdpdGhpbihyb2Fkcy53YXksIGJvdW5kYXJ5Lmdlb21ldHJ5LCAxMDAwKTsNCiAgICANClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9yb2FkczsNCmBgYA0KDQojIyMjIC0gUG9wdWxhdGUgd2F5IHRhYmxlDQoNCldoaWNoIGRvZXMgbW9kaWZpY2F0aW9ucyB0byB0aGUgZm9sbG93aW5nIGNvbHVtbnMgb24gdGhlIHdheXMgdGFibGU6DQoNCiMjIyMjID4gb25lIHdheQ0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBvbmVfd2F5X2NhciA9IE5VTEw7DQoNCi0tIGZ0IGRpcmVjdGlvbg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIG9uZV93YXlfY2FyID0gJ2Z0Jw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICB0cmltKG9zbS5vbmV3YXkpIElOICgnMScsJ3llcycpOw0KDQotLSB0ZiBkaXJlY3Rpb24NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBvbmVfd2F5X2NhciA9ICd0ZicNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgdHJpbShvc20ub25ld2F5KSA9ICctMSc7DQoNCmBgYA0KDQojIyMjIyA+IHdpZHRoDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgd2lkdGggPSBOVUxMOw0KDQotLSBmZWV0DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgd2lkdGggPSBzdWJzdHJpbmcob3NtLndpZHRoIGZyb20gJ1xkK1wuP1xkP1xkPycpOjpGTE9BVC8zLjI4MDg0DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS53aWR0aCBJUyBOT1QgTlVMTA0KQU5EICAgICBvc20ud2lkdGggTElLRSAnJSBmdCc7DQoNCi0tIG1ldGVycw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHdpZHRoID0gc3Vic3RyaW5nKG9zbS53aWR0aCBmcm9tICdcZCtcLj9cZD9cZD8nKTo6RkxPQVQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLndpZHRoIElTIE5PVCBOVUxMDQpBTkQgICAgIG9zbS53aWR0aCBMSUtFICclIG0nOw0KDQotLSBubyB1bml0cyAoZGVmYXVsdD1tZXRlcnMpDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgd2lkdGggPSBzdWJzdHJpbmcob3NtLndpZHRoIGZyb20gJ1xkK1wuP1xkP1xkPycpOjpGTE9BVA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20ud2lkdGggSVMgTk9UIE5VTEwNCkFORCAgICAgc3Vic3RyaW5nKG9zbS53aWR0aCBmcm9tICdcZCtcLj9cZD9cZD8nKTo6RkxPQVQgPCAyMDsNCg0KLS0gVGhpbmdzIGNoYW5nZWQ6IEknZCByYXRoZXIgaGF2ZSB3aWR0aCBpbiBtZXRlcnMsIHNvIEkgY2hhbmdlZCBhbGwgdGhlIGNvbnZlcnNpb24gZmFjdG9ycy4NCmBgYA0KDQojIyMjIyA+IGZ1bmN0aW9uYWwgY2xhc3MNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdW5jdGlvbmFsX2NsYXNzID0gTlVMTDsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSBvc20uaGlnaHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSBJTiAoDQogICAgICAgICAgICAnbW90b3J3YXknLA0KICAgICAgICAgICAgJ3RlcnRpYXJ5JywNCiAgICAgICAgICAgICd0cnVuaycsDQogICAgICAgICAgICAndGVydGlhcnlfbGluaycsDQogICAgICAgICAgICAnbW90b3J3YXlfbGluaycsDQogICAgICAgICAgICAnc2Vjb25kYXJ5X2xpbmsnLA0KICAgICAgICAgICAgJ3ByaW1hcnlfbGluaycsDQogICAgICAgICAgICAndHJ1bmtfbGluaycsDQogICAgICAgICAgICAndW5jbGFzc2lmaWVkJywNCiAgICAgICAgICAgICdyZXNpZGVudGlhbCcsDQogICAgICAgICAgICAnc2Vjb25kYXJ5JywNCiAgICAgICAgICAgICdwcmltYXJ5JywNCiAgICAgICAgICAgICdsaXZpbmdfc3RyZWV0Jw0KKTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndHJhY2snDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5ID0gJ3RyYWNrJw0KQU5EICAgICBvc20udHJhY2t0eXBlID0gJ2dyYWRlMSc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5IElOICgnY3ljbGV3YXknLCdwYXRoJyk7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnLA0KICAgICAgICB4d2FsayA9IDENCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXkgPSAnZm9vdHdheScNCkFORCAgICAgb3NtLmZvb3R3YXkgPSAnY3Jvc3NpbmcnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSA9ICdmb290d2F5Jw0KQU5EICAgICBvc20uYmljeWNsZSA9ICdkZXNpZ25hdGVkJw0KQU5EICAgICAob3NtLmFjY2VzcyBJUyBOVUxMIE9SIG9zbS5hY2Nlc3MgTk9UIElOICgnbm8nLCdwcml2YXRlJykpDQpBTkQgICAgIENPQUxFU0NFKHJlY2VpdmVkLnNhX3dheXMud2lkdGgsMCkgPj0gODsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncGF0aCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXk9J3NlcnZpY2UnDQpBTkQgICAgIG9zbS5iaWN5Y2xlPSdkZXNpZ25hdGVkJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnbGl2aW5nX3N0cmVldCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXkgPSAncGVkZXN0cmlhbicNCkFORCAgICAgb3NtLmJpY3ljbGUgSU4gKCd5ZXMnLCdwZXJtaXNzaXZlJywgJ2Rlc2lnbmF0ZWQnKQ0KQU5EICAgICAob3NtLmFjY2VzcyBJUyBOVUxMIE9SIG9zbS5hY2Nlc3MgTk9UIElOICgnbm8nLCdwcml2YXRlJykpOw0KDQotLSByZW1vdmUgc3R1ZmYgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJvdXRlIG92ZXINCkRFTEVURSBGUk9NIHJlY2VpdmVkLnNhX3dheXMgV0hFUkUgZnVuY3Rpb25hbF9jbGFzcyBJUyBOVUxMOw0KDQotLSByZW1vdmUgb3JwaGFucw0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2Ffd2F5cw0KV0hFUkUgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcNCiAgICAgICAgICAgIFdIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fdG8gSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQogICAgICAgICAgICBBTkQgICAgIHcucm9hZF9pZCAhPSByZWNlaXZlZC5zYV93YXlzLnJvYWRfaWQNCikNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX2Zyb20gSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQogICAgICAgICAgICBBTkQgICAgIHcucm9hZF9pZCAhPSByZWNlaXZlZC5zYV93YXlzLnJvYWRfaWQNCik7DQoNCi0tIHJlbW92ZSBvYnNvbGV0ZSBpbnRlcnNlY3Rpb25zDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV93YXlzX2ludA0KV0hFUkUgTk9UIEVYSVNUUyAoDQogICAgU0VMRUNUICAxDQogICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcNCiAgICBXSEVSRSAgIGludF9pZCBJTiAody5pbnRlcnNlY3Rpb25fdG8sdy5pbnRlcnNlY3Rpb25fZnJvbSkNCik7DQoNCmBgYA0KDQojIyMjIyA+IHBhdGhzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2VuZXJhdGVkLnNhX3BhdGhzOw0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuaWR4X3NhX3dheXNfcGF0aF9pZDsNCg0KQ1JFQVRFIFRBQkxFIGdlbmVyYXRlZC5zYV9wYXRocyAoDQogICAgcGF0aF9pZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgZ2VvbSBnZW9tZXRyeShtdWx0aWxpbmVzdHJpbmcsID9zYV9jcnMpLA0KICAgIHJvYWRfaWRzIElOVEVHRVJbXSwNCiAgICBwYXRoX2xlbmd0aCBJTlRFR0VSLA0KICAgIGJib3hfbGVuZ3RoIElOVEVHRVINCik7DQoNCi0tIGNvbWJpbmUgY29udGlndW91cyBwYXRocw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3BhdGhzIChnZW9tKQ0KU0VMRUNUICBTVF9Db2xsZWN0aW9uRXh0cmFjdCgNCiAgICAgICAgICAgIFNUX1NldFNSSUQoDQogICAgICAgICAgICAgICAgdW5uZXN0KFNUX0NsdXN0ZXJJbnRlcnNlY3RpbmcoZ2VvbSkpLA0KICAgICAgICAgICAgICAgID9zYV9jcnMNCiAgICAgICAgICAgICksDQogICAgICAgICAgICAyICAgLS1saW5lc3RyaW5ncw0KICAgICAgICApDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJzsNCg0KLS0gZ2V0IHJhdyBsZW5ndGhzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wYXRocw0KU0VUICAgICBwYXRoX2xlbmd0aCA9IFNUX0xlbmd0aChnZW9tKTsNCg0KLS0gZ2V0IGJvdW5kaW5nIGJveCBsZW5ndGhzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wYXRocw0KU0VUICAgICBiYm94X2xlbmd0aCA9IFNUX0xlbmd0aCgNCiAgICAgICAgICAgIFNUX1NldFNSSUQoDQogICAgICAgICAgICAgICAgU1RfTWFrZUxpbmUoDQogICAgICAgICAgICAgICAgICAgIFNUX01ha2VQb2ludChTVF9YTWluKGdlb20pLCBTVF9ZTWluKGdlb20pKSwNCiAgICAgICAgICAgICAgICAgICAgU1RfTWFrZVBvaW50KFNUX1hNYXgoZ2VvbSksIFNUX1lNYXgoZ2VvbSkpDQogICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICA/c2FfY3JzDQogICAgICAgICAgICApDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9wYXRoc19nZW9tIE9OIGdlbmVyYXRlZC5zYV9wYXRocyBVU0lORyBHSVNUIChnZW9tKTsNCkFOQUxZWkUgZ2VuZXJhdGVkLnNhX3BhdGhzIChnZW9tKTsNCg0KLS0gc2V0IHBhdGhfaWQgb24gZWFjaCByb2FkIHNlZ21lbnQgKGlmIHBhdGgpDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgcGF0aF9pZCA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgcGF0aHMucGF0aF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcGF0aHMgcGF0aHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhyZWNlaXZlZC5zYV93YXlzLmdlb20scGF0aHMuZ2VvbSkNCiAgICAgICAgICAgIEFORCAgICAgU1RfQ292ZXJlZEJ5KHJlY2VpdmVkLnNhX3dheXMuZ2VvbSxwYXRocy5nZW9tKQ0KICAgICAgICAgICAgTElNSVQgICAxDQogICAgICAgICkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJzsNCg0KLS0gZ2V0IHN0cmFnZ2xlcnMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBwYXRoX2lkID0gcGF0aHMucGF0aF9pZA0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcGF0aHMgcGF0aHMNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5mdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMucGF0aF9pZCBJUyBOVUxMDQpBTkQgICAgIFNUX0ludGVyc2VjdHMocmVjZWl2ZWQuc2Ffd2F5cy5nZW9tLHBhdGhzLmdlb20pDQpBTkQgICAgIFNUX0NvdmVyZWRCeShyZWNlaXZlZC5zYV93YXlzLmdlb20sU1RfQnVmZmVyKHBhdGhzLmdlb20sMSkpOw0KDQotLSBzZXQgaW5kZXgNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19wYXRoX2lkIE9OIHJlY2VpdmVkLnNhX3dheXMgKHBhdGhfaWQpOw0KQU5BTFlaRSByZWNlaXZlZC5zYV93YXlzIChwYXRoX2lkKTsNCg0KLS0gc2V0IHJvYWRfaWRzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wYXRocw0KU0VUICAgICByb2FkX2lkcyA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgcm9hZF9pZA0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzDQogICAgICAgICAgICBXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMucGF0aF9pZCA9IGdlbmVyYXRlZC5zYV9wYXRocy5wYXRoX2lkDQogICAgICAgICkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIGFpZHhfc2FfcGF0aHNfcm9hZF9pZHMgT04gZ2VuZXJhdGVkLnNhX3BhdGhzIFVTSU5HIEdJTiAocm9hZF9pZHMpOw0KQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcGF0aHMgKHJvYWRfaWRzKTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcGF0aHM7DQpgYGANCg0KIyMjIyMgPiBzcGVlZCBsaW1pdA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIHNwZWVkX2xpbWl0ID0gTlVMTDsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHNwZWVkX2xpbWl0ID0gc3Vic3RyaW5nKG9zbS5tYXhzcGVlZCBmcm9tICdcZCsnKTo6SU5UDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkOw0KDQotLSBUaGluZ3MgY2hhbmdlZDpyZW1vdmVkIGxhc3QgbGluZSB3aGVyZSB0aGV5IHByb21wdGVkIGZvciBzcGVlZHMgaW4gbXBoLg0KYGBgDQoNCiMjIyMjID4gbGFuZXMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9sYW5lcyA9IE5VTEwsIHRmX2xhbmVzID0gTlVMTCwgZnRfY3Jvc3NfbGFuZXMgPSBOVUxMLCB0Zl9jcm9zc19sYW5lcyA9IE5VTEw7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9sYW5lcyA9DQogICAgICAgICAgICBDQVNFICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzOmZvcndhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc20uInR1cm46bGFuZXM6Zm9yd2FyZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3NwbGl0X3RvX2FycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lczpmb3J3YXJkIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lczpmb3J3YXJkIiBGUk9NICdcXGQrJyk6OklOVA0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXMiIElTIE5PVCBOVUxMIEFORCByZWNlaXZlZC5zYV93YXlzLm9uZV93YXlfY2FyID0gJ2Z0Jw0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBjZWlsKHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OkZMT0FUIC8gMikNCiAgICAgICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICB0Zl9sYW5lcyA9DQogICAgICAgICAgICAgICAgICAgIENBU0UgICAgV0hFTiBvc20uInR1cm46bGFuZXM6YmFja3dhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc20uInR1cm46bGFuZXM6YmFja3dhcmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInR1cm46bGFuZXMiIElTIE5PVCBOVUxMIEFORCByZWNlaXZlZC5zYV93YXlzLm9uZV93YXlfY2FyID0gJ3RmJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3NwbGl0X3RvX2FycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgLS0gb25seSBvbmUgZGltZW5zaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lczpiYWNrd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lczpiYWNrd2FyZCIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXMiIElTIE5PVCBOVUxMIEFORCByZWNlaXZlZC5zYV93YXlzLm9uZV93YXlfY2FyID0gJ3RmJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OklOVA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBjZWlsKHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OkZMT0FUIC8gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIGZ0X2Nyb3NzX2xhbmVzID0NCiAgICAgICAgICAgIENBU0UgICAgV0hFTiBvc20uInR1cm46bGFuZXM6Zm9yd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcmVtb3ZlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzOmZvcndhcmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFx8Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0JyAgICAgLS0gZG9uJ3QgY29uc2lkZXIgcmlnaHQtb25seSBsYW5lcyBmb3IgY3Jvc3Npbmcgc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcmVtb3ZlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodCcgICAgIC0tIGRvbid0IGNvbnNpZGVyIHJpZ2h0LW9ubHkgbGFuZXMgZm9yIGNyb3NzaW5nIHN0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXM6Zm9yd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXM6Zm9yd2FyZCIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXMiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgY2VpbChzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpGTE9BVCAvIDIpDQogICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdGZfY3Jvc3NfbGFuZXMgPQ0KICAgICAgICAgICAgQ0FTRSAgICBXSEVOIG9zbS4idHVybjpsYW5lczpiYWNrd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcmVtb3ZlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzOmJhY2t3YXJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodCcgICAgIC0tIGRvbid0IGNvbnNpZGVyIHJpZ2h0LW9ubHkgbGFuZXMgZm9yIGNyb3NzaW5nIHN0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4idHVybjpsYW5lcyIgSVMgTk9UIE5VTEwgQU5EIHJlY2VpdmVkLnNhX3dheXMub25lX3dheV9jYXIgPSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3JlbW92ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQnICAgICAtLSBkb24ndCBjb25zaWRlciByaWdodC1vbmx5IGxhbmVzIGZvciBjcm9zc2luZyBzdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgLS0gb25seSBvbmUgZGltZW5zaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzOmJhY2t3YXJkIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lczpiYWNrd2FyZCIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICd0ZicNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXMiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgY2VpbChzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpGTE9BVCAvIDIpDQogICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdHdsdGxfY3Jvc3NfbGFuZXMgPQ0KICAgICAgICAgICAgQ0FTRSAgICBXSEVOIG9zbS4ibGFuZXM6Ym90aF93YXlzIiBJUyBOT1QgTlVMTCBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInR1cm46bGFuZXM6Ym90aF93YXlzIiBJUyBOT1QgTlVMTCBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgRUxTRSBOVUxMDQogICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZDsNCg0KLS0gVGhpbmdzIGNoYW5nZWQ6IFRoZSBvcmlnaW5hbCBxdWVyeSB1c2VkIG9uZV93YXkgY29sdW1uLCBidXQgdGhhdCBvbmUgaXMgbm90IHBvcHVsYXRlZCB5ZXQsIHNvIEkgY2hhbmdlZCBpdCB0byBvbmVfd2F5X2Nhcg0KYGBgDQoNCiMjIyMjID4gcGFyaw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9wYXJrID0gTlVMTCwgdGZfcGFyayA9IE5VTEw7DQoNCi0tIGJvdGgNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9wYXJrID0gQ0FTRSAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdwYXJhbGxlbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ3BhcmFsZWxsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAnZGlhZ29uYWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdwZXJwZW5kaWN1bGFyJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAnbm9fcGFya2luZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ25vX3N0b3BwaW5nJyBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdGZfcGFyayA9IENBU0UgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAncGFyYWxsZWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdwYXJhbGVsbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ2RpYWdvbmFsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAncGVycGVuZGljdWxhcicgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ25vX3BhcmtpbmcnIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdub19zdG9wcGluZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQ7DQoNCi0tIHJpZ2h0DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfcGFyayA9IENBU0UgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ3BhcmFsbGVsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ3BhcmFsZWxsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ2RpYWdvbmFsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ3BlcnBlbmRpY3VsYXInIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpyaWdodCIgPSAnbm9fcGFya2luZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOnJpZ2h0IiA9ICdub19zdG9wcGluZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQ7DQoNCi0tIGxlZnQNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICB0Zl9wYXJrID0gQ0FTRSAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpsZWZ0IiA9ICdwYXJhbGxlbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmxlZnQiID0gJ3BhcmFsZWxsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6bGVmdCIgPSAnZGlhZ29uYWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpsZWZ0IiA9ICdwZXJwZW5kaWN1bGFyJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6bGVmdCIgPSAnbm9fcGFya2luZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmxlZnQiID0gJ25vX3N0b3BwaW5nJyBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZDsNCg0KYGBgDQoNCiMjIyMjID4gYmlrZSBpbmZyYXN0cnVjdHVyZQ0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X2Jpa2VfaW5mcmEgPSBOVUxMLCB0Zl9iaWtlX2luZnJhID0gTlVMTDsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gZnQgZGlyZWN0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfYmlrZV9pbmZyYSA9IENBU0UNCg0KICAgICAgICAgICAgLS0gOmJvdGgNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpib3RoOmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3RyYWNrJyBBTkQgb3NtLiJvbmV3YXk6YmljeWNsZSIgPSAnbm8nKQ0KICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgV0hFTiAob3NtLiJjeWNsZXdheTpsZWZ0IiA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS5jeWNsZXdheSA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgLS0gb25lLXdheT1mdA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6bGVmdDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHN0dWZmIGZyb20gdHdvLXdheSB0aGF0IGFsc28gYXBwbGllcyB0byBvbmUtd2F5PWZ0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgIC0tIG9uZS13YXk9dGYNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAndGYnDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ29wcG9zaXRlX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheSIgPSAnb3Bwb3NpdGVfdHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gKG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdvcHBvc2l0ZV90cmFjaycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gKG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfdHJhY2snKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgLS0gdHdvLXdheQ0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciBJUyBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTkQsDQoNCiAgICAgICAgdGZfYmlrZV9pbmZyYSA9IENBU0UNCg0KICAgICAgICAgICAgLS0gOmJvdGgNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpib3RoOmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3RyYWNrJyBBTkQgb3NtLiJvbmV3YXk6YmljeWNsZSIgPSAnbm8nKQ0KICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgV0hFTiAob3NtLiJjeWNsZXdheTpsZWZ0IiA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS5jeWNsZXdheSA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgLS0gb25lLXdheT10Zg0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICd0ZicNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHN0dWZmIGZyb20gdHdvLXdheSB0aGF0IGFsc28gYXBwbGllcyB0byBvbmUtd2F5PXRmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmxlZnQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgLS0gb25lLXdheT1mdA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdvcHBvc2l0ZV9sYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV9sYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV9sYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnb3Bwb3NpdGVfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ29wcG9zaXRlX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICdvcHBvc2l0ZV90cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiAob25lX3dheV9jYXIgPSAndGYnIEFORCBvc20uImN5Y2xld2F5OmxlZnQiID0gJ29wcG9zaXRlX3RyYWNrJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiAob25lX3dheV9jYXIgPSAndGYnIEFORCBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV90cmFjaycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAtLSB0d28td2F5DQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyIElTIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6bGVmdDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXkiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkOw0KDQotLSB1cGRhdGUgb25lX3dheSBiYXNlZCBvbiBiaWtlIGluZnJhDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgb25lX3dheSA9IE5VTEw7DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgb25lX3dheSA9IG9uZV93YXlfY2FyDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9uZV93YXlfY2FyID0gJ2Z0Jw0KQU5EICAgICBOT1QgKHRmX2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEwgT1IgQ09BTEVTQ0Uob3NtLiJvbmV3YXk6YmljeWNsZSIsJ3llcycpID0gJ25vJyk7DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgb25lX3dheSA9IG9uZV93YXlfY2FyDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9uZV93YXlfY2FyID0gJ3RmJw0KQU5EICAgICBOT1QgKGZ0X2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEwgT1IgQ09BTEVTQ0Uob3NtLiJvbmV3YXk6YmljeWNsZSIsJ3llcycpID0gJ25vJyk7DQoNCi0tIGdldCBmYWNpbGl0eSB3aWR0aHMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9iaWtlX2luZnJhX3dpZHRoID0gQ0FTRQ0KDQogICAgICAgICAgICAtLSBmZWV0DQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FULzMuMjgwODQNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAnZnQnIEFORCBvc20uImN5Y2xld2F5OmxlZnQ6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmxlZnQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGg6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVC8zLjI4MDg0DQoNCiAgICAgICAgICAgIC0tIG1ldGVycw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ2Z0JyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0OndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmxlZnQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoOndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KDQogICAgICAgICAgICAtLSBubyB1bml0cyAoZGVmYXVsdD1tZXRlcnMpDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ2Z0JyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpsZWZ0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aDp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6Ym90aDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIGZ0X2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEw7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICB0Zl9iaWtlX2luZnJhX3dpZHRoID0gQ0FTRQ0KDQogICAgICAgICAgICAtLSBmZWV0DQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdDp3aWR0aCIgTElLRSAnJSBmdCcNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6bGVmdDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVC8zLjI4MDg0DQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDp3aWR0aCIgTElLRSAnJSBmdCcNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGg6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVC8zLjI4MDg0DQoNCiAgICAgICAgICAgIC0tIG1ldGVycw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQ6d2lkdGgiIExJS0UgJyUgbScNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6bGVmdDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICd0ZicgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIExJS0UgJyUgbScNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoOndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KDQogICAgICAgICAgICAtLSBubyB1bml0cyAoZGVmYXVsdD1tZXRlcnMpDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdDp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6bGVmdDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICd0ZicgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aDp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6Ym90aDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIHRmX2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEw7DQoNCmBgYA0KDQojIyMjIyA+IGNsYXNzIGFkanVzdG1lbnRzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJykNCkFORCAgICAgKA0KICAgICAgICAgICAgZnRfYmlrZV9pbmZyYSBJTiAoJ3RyYWNrJywnYnVmZmVyZWRfbGFuZScsJ2xhbmUnKQ0KICAgICAgICBPUiAgdGZfYmlrZV9pbmZyYSBJTiAoJ3RyYWNrJywnYnVmZmVyZWRfbGFuZScsJ2xhbmUnKQ0KICAgICAgICBPUiAgZnRfbGFuZXMgPiAxDQogICAgICAgIE9SICB0Zl9sYW5lcyA+IDENCiAgICAgICAgT1IgIHNwZWVkX2xpbWl0ID49IDUwDQogICAgICAgICk7DQoNCi0tIFRoaW5ncyBjaGFuZ2VkOiBzcGVlZCBsaW1pdCBmcm9tIDMwIG1waCB0byA1MCBrbWgNCmBgYA0KDQojIyMjIC0gUG9wdWxhdGUgaW50ZXJzZWN0aW9uIHRhYmxlDQoNCldoaWNoIGRvZXMgbW9kaWZpY2F0aW9ucyB0byB0aGUgZm9sbG93aW5nIGNvbHVtbnMgb24gdGhlIGludGVyc2VjdGlvbiB0YWJsZS4NCg0KIyMjIyMgPiBsZWdzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIGxlZ3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKHJvYWRfaWQpDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMNCiAgICAgICAgICAgIFdIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQuaW50X2lkIElOIChpbnRlcnNlY3Rpb25fZnJvbSxpbnRlcnNlY3Rpb25fdG8pDQopOw0KDQpgYGANCg0KIyMjIyMgPiBzaWduYWxpemVkDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgU0VUIHNpZ25hbGl6ZWQgPSAnZic7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSB0cmFmZmljIHNpZ25hbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIHNpZ25hbGl6ZWQgPSAndCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSA9ICd0cmFmZmljX3NpZ25hbHMnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIHNpZ25hbGl6ZWQgPSAndCcNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cywNCiAgICAgICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgaW50X2lkID0gcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fdG8NCkFORCAgICAgb3NtLiJ0cmFmZmljX3NpZ25hbHM6ZGlyZWN0aW9uIiA9ICdmb3J3YXJkJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzaWduYWxpemVkID0gJ3QnDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMsDQogICAgICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIGludF9pZCA9IHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgb3NtLiJ0cmFmZmljX3NpZ25hbHM6ZGlyZWN0aW9uIiA9ICdiYWNrd2FyZCc7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIEhBV0tzIGFuZCBvdGhlciB2YXJpYW50cw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgc2lnbmFsaXplZCA9ICd0Jw0KV0hFUkUgICBsZWdzID4gMg0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgb3NtDQogICAgICAgICAgICBXSEVSRSAgIG9zbS5oaWdod2F5ID0gJ2Nyb3NzaW5nJw0KICAgICAgICAgICAgQU5EICAgICBvc20uY3Jvc3NpbmcgSU4gKCd0cmFmZmljX3NpZ25hbHMnLCdwZWxpY2FuJywndG91Y2FuJykNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBvc20ud2F5LCAyNSkNCiAgICAgICAgKTsNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gQ2FwdHVyZSBzaWduYWxzIGZyb20gb3RoZXIgcG9pbnRzDQotLSBvbiB0aGUgaW50ZXJzZWN0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzaWduYWxpemVkID0gJ3QnDQpXSEVSRSAgIGxlZ3MgPiAyDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaQ0KICAgICAgICAgICAgV0hFUkUgICBpLnNpZ25hbGl6ZWQNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBpLmdlb20sIDI1KQ0KICAgICAgICApOw0KDQpgYGANCg0KIyMjIyMgPiBzdG9wcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFIHJlY2VpdmVkLnNhX3dheXNfaW50IFNFVCBzdG9wcyA9ICdmJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzdG9wcyA9ICd0Jw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50IG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzX2ludC5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5ID0gJ3N0b3AnDQpBTkQgICAgIG9zbS5zdG9wID0gJ2FsbCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgc3RvcHMgPSAndCcNCldIRVJFICAgbGVncyA+IDINCkFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpDQogICAgICAgICAgICBXSEVSRSAgIGkuc3RvcHMNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBpLmdlb20sIDI1KQ0KICAgICAgICApOw0KDQpgYGANCg0KIyMjIyMgPiBycmZiDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgU0VUIHJyZmIgPSBGQUxTRTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBycmZiID0gVFJVRQ0KV0hFUkUgICBsZWdzID4gMg0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgb3NtDQogICAgICAgICAgICBXSEVSRSAgIG9zbS5oaWdod2F5ID0gJ2Nyb3NzaW5nJw0KICAgICAgICAgICAgQU5EICAgICBvc20uZmxhc2hpbmdfbGlnaHRzID0gJ3llcycNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBvc20ud2F5LCAyNSkNCiAgICAgICAgKTsNCmBgYA0KDQojIyMjIyA+IGlzbGFuZA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFIHJlY2VpdmVkLnNhX3dheXNfaW50IFNFVCBpc2xhbmQgPSBGQUxTRTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBpc2xhbmQgPSBUUlVFDQpXSEVSRSAgIGxlZ3MgPiAyDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBvc20NCiAgICAgICAgICAgIFdIRVJFICAgb3NtLmhpZ2h3YXkgPSAnY3Jvc3NpbmcnDQogICAgICAgICAgICBBTkQgICAgIG9zbS5jcm9zc2luZyA9ICdpc2xhbmQnDQogICAgICAgICAgICBBTkQgICAgIFNUX0RXaXRoaW4ocmVjZWl2ZWQuc2Ffd2F5c19pbnQuZ2VvbSwgb3NtLndheSwgMjUpDQogICAgICAgICk7DQpgYGANCg0KQW4gZXhhbXBsZSBvZiBob3cgdGhlIHRhYmxlcyBsb29rIGxpa2UgYWZ0ZXIgdGhpcyBzdGVwOg0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgdGFiLmNhcCA9ICJXYXlzIHRhYmxlIn0NClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBMSU1JVCAxMDsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgdGFiLmNhcCA9ICJJbnRlcnNlY3Rpb24gdGFibGUgdGFibGUifQ0KU0VMRUNUICogRlJPTSByZWNlaXZlZC5zYV93YXlzX2ludCBMSU1JVCAxMDsNCmBgYA0KDQpUaGUgY29kZSBmb3IgdGhpcyBzdGVwIGlzIG5vdCBpbmNsdWRlZCBhcyBpdCBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgdGhlIFBmQiBjb2RlLCBhbmQgaXMgYWN0dWFsbHkgcXVpdGUgbG9uZy4gSG93ZXZlciwgaXQgY2FuIGJlIGV4YW1pbmVkIHRocm91Z2ggdGhlICpSbWQqIGZpbGUgZm9yIHRoaXMgUiBOb3RlYm9vay4NCg0KT25lIGFkZGl0aW9uYWwgdmFsdWUgdGhhdCBJIHdhcyBjb25zaWRlcmluZyBvbiBhZGRpbmcgaXMgc2xvcGUsIGhvd2V2ZXIgSSBoYXZlIG5vdCBnb25lIHRocm91Z2ggd2l0aCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhcmlhYmxlIHlldC4gVGhpcyB3b3VsZCBhbHNvIGFmZmVjdCBzdGVwIDYuIA0KDQojIyMgNi4gQ2FsY3VsYXRlIHN0cmVzcw0KDQpUaGUgc2FtZSBhcyBzdGVwIDUsIHRoaXMgc3RlcCBjb25zaWRlcnMgbWFpbmx5IFNRTCBxdWVyaWVzIGFscmVhZHkgcGVyZm9ybWVkIGJ5IFBmQi4gSXQgd2lsbCBtYWlubHkgYWx0ZXIgdGhlIGNvbHVtbnMgbWVhbnQgdG8gaG9zdCB0aGUgc3RyZXNzIHJhbmsgZm9yIHNlZ21lbnRzIGFuZCBpbnRlcnNlY3Rpb25zLiBJdCBjb25zaWRlcnMgZGlmZmVyZW50IGNhc2VzIHRvIGRvIHRoZSBjbGFzc2lmaWNhdGlvbi4gVGhlIHNjcmlwdHMgdGhhdCBjYW4gYmUgZnVydGhlciBleGFtaW5lZCBvbiB0aGUgKlJtZCogZmlsZSBhcmU6DQoNCiMjIyMjID4gbW90b3J3YXkgdHJ1bmsNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcyA9IE5VTEwsIHRmX3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdtb3RvcndheScsJ21vdG9yd2F5X2xpbmsnLCd0cnVuaycsJ3RydW5rX2xpbmsnKTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9zZWdfc3RyZXNzID0gMywgdGZfc2VnX3N0cmVzcyA9IDMNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ21vdG9yd2F5JywnbW90b3J3YXlfbGluaycsJ3RydW5rJywndHJ1bmtfbGluaycpOw0KYGBgDQoNCiMjIyMjID4gaGlnaGVyIG9yZGVyDQoNCmBgYHtyIGhpZ2hlciBvcmRlciwgaW5jbHVkZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQpzdHJlc3NfaGlnaGVyX29yZGVyX3dheXMgPC0gZnVuY3Rpb24oDQogIGNsYXNzLCANCiAgZGVmYXVsdF9zcGVlZCwgDQogIGRlZmF1bHRfbGFuZXMsIA0KICBkZWZhdWx0X3BhcmtpbmcsDQogIGRlZmF1bHRfcGFya2luZ193aWR0aCwNCiAgZGVmYXVsdF9mYWNpbGl0eV93aWR0aA0KICApDQp7DQogIHNxbGRmKA0KICAgIHBhc3RlMCgNCiAgICAgICINClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcyA9IE5VTEwsIHRmX3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCciLCBjbGFzcywgIicsJyIsIGNsYXNzLCAiJ3x8J19saW5rJyk7DQoNCi0tIGZ0IGRpcmVjdGlvbg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X3NlZ19zdHJlc3MgPQ0KICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgV0hFTiBmdF9iaWtlX2luZnJhID0gJ3RyYWNrJyBUSEVOIDENCiAgICAgICAgICAgIFdIRU4gZnRfYmlrZV9pbmZyYSA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDEgVEhFTiAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDwgNTAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgV0hFTiBmdF9iaWtlX2luZnJhID0gJ2xhbmUnIEFORCBDT0FMRVNDRShmdF9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAwICAtLSBiaWtlIGxhbmUgd2l0aCBubyBwYXJraW5nDQogICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNTAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDIgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIFdIRU4gZnRfYmlrZV9pbmZyYSA9ICdsYW5lJyBBTkQgQ09BTEVTQ0UoZnRfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMQ0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9iaWtlX2luZnJhX3dpZHRoLCIsIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgsICIpICsgIiwgZGVmYXVsdF9wYXJraW5nX3dpZHRoLCAiID49IDUgICAtLSB0cmVhdCBhcyBidWZmZXJlZCBsYW5lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNjAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNjAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPCA1MCBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2Jpa2VfaW5mcmFfd2lkdGgsIiwgZGVmYXVsdF9mYWNpbGl0eV93aWR0aCwgIikgKyAiLCBkZWZhdWx0X3Bhcmtpbmdfd2lkdGgsICIgPj0gNCAgIC0tIHRyZWF0IGFzIGJpa2UgbGFuZSB3aXRoIG5vIHBhcmtpbmcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPiA1MCBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDQwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMiBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgLS0gc2hhcmVkIGxhbmUNCiAgICAgICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPSAxIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTkQsDQogICAgICAgIHRmX3NlZ19zdHJlc3MgPQ0KICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgV0hFTiB0Zl9iaWtlX2luZnJhID0gJ3RyYWNrJyBUSEVOIDENCiAgICAgICAgICAgIFdIRU4gdGZfYmlrZV9pbmZyYSA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDEgVEhFTiAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDwgNTAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgV0hFTiB0Zl9iaWtlX2luZnJhID0gJ2xhbmUnIEFORCBDT0FMRVNDRSh0Zl9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAwICAtLSBiaWtlIGxhbmUgd2l0aCBubyBwYXJraW5nDQogICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNTAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDIgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIFdIRU4gdGZfYmlrZV9pbmZyYSA9ICdsYW5lJyBBTkQgQ09BTEVTQ0UodGZfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMQ0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9iaWtlX2luZnJhX3dpZHRoLCIsIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgsICIpICsgIiwgZGVmYXVsdF9wYXJraW5nX3dpZHRoLCAiID49IDUgICAtLSB0cmVhdCBhcyBidWZmZXJlZCBsYW5lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNjAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNjAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPCA1MCBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2Jpa2VfaW5mcmFfd2lkdGgsIiwgZGVmYXVsdF9mYWNpbGl0eV93aWR0aCwgIikgKyAiLCBkZWZhdWx0X3Bhcmtpbmdfd2lkdGgsICIgPj0gNCAgIC0tIHRyZWF0IGFzIGJpa2UgbGFuZSB3aXRoIG5vIHBhcmtpbmcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPiA1MCBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDQwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMiBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgLS0gc2hhcmVkIGxhbmUNCiAgICAgICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPSAxIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTkQNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJyIsIGNsYXNzLCAiJywnIiwgY2xhc3MsICInfHwnX2xpbmsnKTsNCiAgICAgICINCiAgICApLA0KICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQogICkNCn0NCg0Kc3RyZXNzX2hpZ2hlcl9vcmRlcl93YXlzKA0KICBjbGFzcyA9ICJwcmltYXJ5IiwgDQogIGRlZmF1bHRfc3BlZWQgPSA3MCwgDQogIGRlZmF1bHRfbGFuZXMgPSAyLCANCiAgZGVmYXVsdF9wYXJraW5nID0gMSwNCiAgZGVmYXVsdF9wYXJraW5nX3dpZHRoID0gMi41LA0KICBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoID0gMS41DQopDQoNCnN0cmVzc19oaWdoZXJfb3JkZXJfd2F5cygNCiAgY2xhc3MgPSAic2Vjb25kYXJ5IiwgDQogIGRlZmF1bHRfc3BlZWQgPSA3MCwgDQogIGRlZmF1bHRfbGFuZXMgPSAyLCANCiAgZGVmYXVsdF9wYXJraW5nID0gMSwNCiAgZGVmYXVsdF9wYXJraW5nX3dpZHRoID0gMi41LA0KICBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoID0gMS41DQopDQoNCnN0cmVzc19oaWdoZXJfb3JkZXJfd2F5cygNCiAgY2xhc3MgPSAidGVydGlhcnkiLCANCiAgZGVmYXVsdF9zcGVlZCA9IDUwLCANCiAgZGVmYXVsdF9sYW5lcyA9IDEsIA0KICBkZWZhdWx0X3BhcmtpbmcgPSAxLA0KICBkZWZhdWx0X3Bhcmtpbmdfd2lkdGggPSAyLjUsDQogIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGggPSAxLjUNCikNCg0KIyBUaGluZ3MgY2hhbmdlZDogc3BlZWRzIC0gNDBtcGg9NzBrbWggMzVtcGg9NjBrbWggMzBtcGg9NTBrbWggMjVtcGg9NDBrbWggMjBtcGg9MzBrbWgsIHdpZHRoIC0gMTVmdD01bSAxM2Z0PTRtIDhmdD0yLjVtIDVmdD0xLjVtIDI3ZnQ9OG0gMTlmdD02bQ0KYGBgDQoNCiMjIyMjID4gbG93ZXIgb3JkZXINCg0KYGBge3IgbG93ZXIgb3JkZXIsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KDQpzdHJlc3NfbG93ZXJfb3JkZXJfd2F5cyA8LSBmdW5jdGlvbigNCiAgY2xhc3MsIA0KICBkZWZhdWx0X3NwZWVkLCANCiAgZGVmYXVsdF9sYW5lcywgDQogIGRlZmF1bHRfcGFya2luZywNCiAgZGVmYXVsdF9yb2Fkd2F5X3dpZHRoDQogICkNCnsNCiAgc3FsZGYoDQogICAgcGFzdGUwKA0KICAgICAgIg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9zZWdfc3RyZXNzPU5VTEwsIHRmX3NlZ19zdHJlc3M9TlVMTA0KICBXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnIiwgY2xhc3MsICInOw0KICANCiAgVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQogIFNFVCAgICAgZnRfc2VnX3N0cmVzcyA9DQogICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDQwDQogICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgKyBDT0FMRVNDRSh0Zl9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAyICAgIC0tIHBhcmtpbmcgb24gYm90aCBzaWRlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uod2lkdGgsIiwgZGVmYXVsdF9yb2Fkd2F5X3dpZHRoLCAiKSA+PSA4DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgIENBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBwYXJraW5nIG9uIG9uZSBzaWRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3aWR0aCwiLCBkZWZhdWx0X3JvYWR3YXlfd2lkdGgsICIpID49IDYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwIFRIRU4gMQ0KICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgRU5ELA0KICAgICAgICAgIHRmX3NlZ19zdHJlc3MgPQ0KICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpICsgQ09BTEVTQ0UodGZfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMiAgICAtLSBwYXJraW5nIG9uIGJvdGggc2lkZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHdpZHRoLCIsIGRlZmF1bHRfcm9hZHdheV93aWR0aCwgIikgPj0gOA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICBDQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcGFya2luZyBvbiBvbmUgc2lkZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uod2lkdGgsIiwgZGVmYXVsdF9yb2Fkd2F5X3dpZHRoLCAiKSA+PSA2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMCBUSEVOIDENCiAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgIEVORA0KICBXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnIiwgY2xhc3MsICInOw0KICANCiAgICAgICINCiAgICApLA0KICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQogICkNCn0NCg0KDQoNCnN0cmVzc19sb3dlcl9vcmRlcl93YXlzKA0KICBjbGFzcyA9ICJyZXNpZGVudGlhbCIsIA0KICBkZWZhdWx0X3NwZWVkID0gNDAsIA0KICBkZWZhdWx0X2xhbmVzID0gMSwgDQogIGRlZmF1bHRfcGFya2luZyA9IDEsDQogIGRlZmF1bHRfcm9hZHdheV93aWR0aCA9IDgNCikNCg0Kc3RyZXNzX2xvd2VyX29yZGVyX3dheXMoDQogIGNsYXNzID0gInVuY2xhc3NpZmllZCIsIA0KICBkZWZhdWx0X3NwZWVkID0gNDAsIA0KICBkZWZhdWx0X2xhbmVzID0gMSwgDQogIGRlZmF1bHRfcGFya2luZyA9IDEsDQogIGRlZmF1bHRfcm9hZHdheV93aWR0aCA9IDgNCikNCg0KIyBSZW1hcms6IHdoeSBkbyB0aGV5IHVzZSBkZWZhdWx0X2xhbmVzIGlmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgaXQ/DQpgYGANCg0KIyMjIyMgPiBsaXZpbmcgc3RyZWV0DQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X3NlZ19zdHJlc3MgPSBOVUxMLCB0Zl9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ2xpdmluZ19zdHJlZXQnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfc2VnX3N0cmVzcyA9IDMsDQogICAgICAgIHRmX3NlZ19zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdsaXZpbmdfc3RyZWV0Jw0KQU5EICAgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmJpY3ljbGUgPSAnbm8nOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfc2VnX3N0cmVzcyA9IENPQUxFU0NFKGZ0X3NlZ19zdHJlc3MsMSksDQogICAgICAgIHRmX3NlZ19zdHJlc3MgPSBDT0FMRVNDRSh0Zl9zZWdfc3RyZXNzLDEpDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnbGl2aW5nX3N0cmVldCc7DQpgYGANCg0KIyMjIyMgPiB0cmFjaw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9zZWdfc3RyZXNzID0gTlVMTCwgdGZfc2VnX3N0cmVzcyA9IE5VTEwNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0cmFjayc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9zZWdfc3RyZXNzID0gMSwNCiAgICAgICAgdGZfc2VnX3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0cmFjayc7DQpgYGANCg0KIyMjIyMgPiBwYXRoDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X3NlZ19zdHJlc3MgPSBOVUxMLCB0Zl9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfc2VnX3N0cmVzcyA9IDEsDQogICAgICAgIHRmX3NlZ19zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncGF0aCc7DQpgYGANCg0KIyMjIyMgPiBvbmUgd2F5IHJlc2V0DQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfc2VnX3N0cmVzcyA9IE5VTEwNCldIRVJFICAgb25lX3dheSA9ICd0Zic7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICB0Zl9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBvbmVfd2F5ID0gJ2Z0JzsNCg0KLS0gcmVzZXQgb3Bwb3NpdGUgc3RyZXNzIGZvciBvbmUtd2F5DQpgYGANCg0KIyMjIyMgPiBtb3RvcndheSB0cnVuayBpbnRlcnNlY3Rpb24NCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfaW50X3N0cmVzcyA9IDEsIHRmX2ludF9zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdtb3RvcndheScsJ3RydW5rJyk7DQoNCi0tIGFzc3VtZSBsb3cgc3RyZXNzLCBzaW5jZSB0aGVzZSBqdW5jaW9ucyB3b3VsZCBhbHdheXMgYmUgY29udHJvbGxlZCBvciBmcmVlIGZsb3dpbmcNCmBgYA0KDQojIyMjIyA+IHByaW1hcnkgaW50ZXJzZWN0aW9uDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X2ludF9zdHJlc3MgPSAxLCB0Zl9pbnRfc3RyZXNzID0gMQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknOw0KDQotLSBhc3N1bWUgbG93IHN0cmVzcywgc2luY2UgdGhlc2UganVuY2lvbnMgd291bGQgYWx3YXlzIGJlIGNvbnRyb2xsZWQgb3IgZnJlZSBmbG93aW5nDQpgYGANCg0KIyMjIyMgPiBzZWNvbmRhcnkgaW50ZXJzZWN0aW9uIA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9pbnRfc3RyZXNzID0gMSwgdGZfaW50X3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknOw0KDQotLSBhc3N1bWUgbG93IHN0cmVzcywgc2luY2UgdGhlc2UganVuY2lvbnMgd291bGQgYWx3YXlzIGJlIGNvbnRyb2xsZWQgb3IgZnJlZSBmbG93aW5nDQpgYGANCg0KIyMjIyMgPiB0ZXJ0aWFyeSBpbnRlcnNlY3Rpb24gDQoNCmBgYHtyIHRlcnRpYXJ5IGludGVyc2VjdGlvbiwgaW5jbHVkZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQpzdHJlc3NfdGVydGlhcnlfaW50IDwtIGZ1bmN0aW9uKA0KICBwcmltYXJ5X3NwZWVkLCANCiAgc2Vjb25kYXJ5X3NwZWVkLCANCiAgcHJpbWFyeV9sYW5lcywgDQogIHNlY29uZGFyeV9sYW5lcw0KICApDQp7DQogIHNxbGRmKA0KICAgIHBhc3RlMCgNCiAgICAgICINClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfaW50X3N0cmVzcyA9IDEsIHRmX2ludF9zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknOw0KDQotLSBmdA0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fdG8gPSBpLmludF9pZA0KQU5EICAgICBOT1QgaS5zaWduYWxpemVkDQpBTkQgICAgIE5PVCBpLnN0b3BzDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIGkuaW50X2lkIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICBDT0FMRVNDRShyZWNlaXZlZC5zYV93YXlzLm5hbWUsJ2EnKSAhPSBDT0FMRVNDRSh3Lm5hbWUsJ2InKQ0KICAgICAgICAgICAgQU5EICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCd0cnVuaycpIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgIEVORA0KKTsNCg0KDQotLSB0Zg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHRmX2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fZnJvbSA9IGkuaW50X2lkDQpBTkQgICAgIE5PVCBpLnNpZ25hbGl6ZWQNCkFORCAgICAgTk9UIGkuc3RvcHMNCkFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcNCiAgICAgICAgICAgIFdIRVJFICAgaS5pbnRfaWQgSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQogICAgICAgICAgICBBTkQgICAgIENPQUxFU0NFKHJlY2VpdmVkLnNhX3dheXMubmFtZSwnYScpICE9IENPQUxFU0NFKHcubmFtZSwnYicpDQogICAgICAgICAgICBBTkQgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdtb3RvcndheScsJ3RydW5rJykgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPiA0IFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHByaW1hcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAncHJpbWFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiA0IFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBzZWNvbmRhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAnc2Vjb25kYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgRU5EDQopOw0KDQogICAgICAiDQogICAgKSwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCikNCn0NCg0Kc3RyZXNzX3RlcnRpYXJ5X2ludCgNCiAgcHJpbWFyeV9zcGVlZCA9IDcwLA0KICBzZWNvbmRhcnlfc3BlZWQgPSA3MCwNCiAgcHJpbWFyeV9sYW5lcyA9IDIsDQogIHNlY29uZGFyeV9sYW5lcyA9IDINCikNCg0KYGBgDQoNCiMjIyMjID4gbG93ZXIgaW50ZXJzZWN0aW9uIA0KDQpgYGB7ciBsb3dlciBpbnRlcnNlY3Rpb24sIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0Kc3RyZXNzX2xvd2VyX2ludCA8LSBmdW5jdGlvbigNCiAgcHJpbWFyeV9zcGVlZCwNCiAgc2Vjb25kYXJ5X3NwZWVkLA0KICB0ZXJ0aWFyeV9zcGVlZCwNCiAgcHJpbWFyeV9sYW5lcywNCiAgc2Vjb25kYXJ5X2xhbmVzLA0KICB0ZXJ0aWFyeV9sYW5lcw0KKQ0Kew0KICBzcWxkZigNCiAgICBwYXN0ZTAoDQogICAgICAiDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X2ludF9zdHJlc3MgPSAxLCB0Zl9pbnRfc3RyZXNzID0gMQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzIElOICgncmVzaWRlbnRpYWwnLCd1bmNsYXNzaWZpZWQnLCdsaXZpbmdfc3RyZWV0JywndHJhY2snLCdwYXRoJyk7DQoNCi0tIGZ0DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfaW50X3N0cmVzcyA9IDMNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzIElOICgncmVzaWRlbnRpYWwnLCd1bmNsYXNzaWZpZWQnLCdsaXZpbmdfc3RyZWV0JywndHJhY2snLCdwYXRoJykNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fdG8gPSBpLmludF9pZA0KQU5EICAgICBOT1QgaS5zaWduYWxpemVkDQpBTkQgICAgIE5PVCBpLnN0b3BzDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIGkuaW50X2lkIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICBDT0FMRVNDRShyZWNlaXZlZC5zYV93YXlzLm5hbWUsJ2EnKSAhPSBDT0FMRVNDRSh3Lm5hbWUsJ2InKQ0KICAgICAgICAgICAgQU5EICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCd0cnVuaycpIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSB0ZXJ0aWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHRlcnRpYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3RlcnRpYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgRU5EDQopOw0KDQoNCi0tIHRmDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgdGZfaW50X3N0cmVzcyA9IDMNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzIElOICgncmVzaWRlbnRpYWwnLCd1bmNsYXNzaWZpZWQnLCdsaXZpbmdfc3RyZWV0JywndHJhY2snLCdwYXRoJykNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fZnJvbSA9IGkuaW50X2lkDQpBTkQgICAgIE5PVCBpLnNpZ25hbGl6ZWQNCkFORCAgICAgTk9UIGkuc3RvcHMNCkFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcNCiAgICAgICAgICAgIFdIRVJFICAgaS5pbnRfaWQgSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQogICAgICAgICAgICBBTkQgICAgIENPQUxFU0NFKHJlY2VpdmVkLnNhX3dheXMubmFtZSwnYScpICE9IENPQUxFU0NFKHcubmFtZSwnYicpDQogICAgICAgICAgICBBTkQgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdtb3RvcndheScsJ3RydW5rJykgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPiA0IFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHByaW1hcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAncHJpbWFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiA0IFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBzZWNvbmRhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAnc2Vjb25kYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHRlcnRpYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3RlcnRpYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPiA0IFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgdGVydGlhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICBFTkQNCik7DQoNCiAgICAgICINCiAgICApLA0KICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQogICkNCn0NCg0Kc3RyZXNzX2xvd2VyX2ludCgNCiAgcHJpbWFyeV9zcGVlZCA9IDcwLA0KICBzZWNvbmRhcnlfc3BlZWQgPSA3MCwNCiAgdGVydGlhcnlfc3BlZWQgPSA1MCwNCiAgcHJpbWFyeV9sYW5lcyA9IDIsDQogIHNlY29uZGFyeV9sYW5lcyA9IDIsDQogIHRlcnRpYXJ5X2xhbmVzID0gMQ0KKQ0KDQpgYGANCg0KIyMjIyMgPiBsaW5rIGludGVyc2VjdGlvbg0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9pbnRfc3RyZXNzID0gMSwgdGZfaW50X3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBMSUtFICclX2xpbmsnOw0KYGBgDQoNCkFuIGV4YW1wbGUgb2YgaG93IHRoZSB0YWJsZXMgbG9vayBsaWtlIGFmdGVyIHRoaXMgc3RlcDoNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIHRhYi5jYXAgPSAiV2F5cyB0YWJsZSJ9DQpTRUxFQ1Qgb3NtX2lkLCBuYW1lLCBmdF9zZWdfc3RyZXNzLCB0Zl9zZWdfc3RyZXNzLCBmdF9pbnRfc3RyZXNzLCB0Zl9pbnRfc3RyZXNzIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBMSU1JVCAxMDsNCmBgYA0KDQojIyMgNy4gQnVpbGQgbmV0d29yaw0KDQpPbiB0aGlzIHN0ZXAgdGhlIG5ldHdvcmsgaXMgYnVpbHQgYnkgY3JlYXRpbmcgdHdvIHRhYmxlczogdmVydGljZXMgYW5kIGxpbmtzLiBBcyB0aGUgbGFzdCAyIHN0ZXBzLCB0aGUgY29kZSB3b24ndCBiZSBpbmNsdWRlIGJ1dCBjYW4gYmUgYW5hbHl6ZWQgb24gdGhlICpSbWQqIGZpbGUuIA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydDsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbms7DQoNCi0tIGNyZWF0ZSBuZXcgdGFibGVzDQpDUkVBVEUgVEFCTEUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCAoDQogICAgdmVydF9pZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgcm9hZF9pZCBJTlRFR0VSLA0KICAgIHZlcnRfY29zdCBJTlRFR0VSLA0KICAgIGdlb20gZ2VvbWV0cnkocG9pbnQsP3NhX2NycykNCik7DQoNCkNSRUFURSBUQUJMRSByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rICgNCiAgICBsaW5rX2lkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBpbnRfaWQgSU5URUdFUiwNCiAgICB0dXJuX2FuZ2xlIElOVEVHRVIsDQogICAgaW50X2Nyb3NzaW5nIEJPT0xFQU4sDQogICAgaW50X3N0cmVzcyBJTlRFR0VSLA0KICAgIHNvdXJjZV92ZXJ0IElOVEVHRVIsDQogICAgc291cmNlX3JvYWRfaWQgSU5URUdFUiwNCiAgICBzb3VyY2Vfcm9hZF9kaXIgVkFSQ0hBUigyKSwNCiAgICBzb3VyY2Vfcm9hZF9hemkgSU5URUdFUiwNCiAgICBzb3VyY2Vfcm9hZF9sZW5ndGggSU5URUdFUiwNCiAgICBzb3VyY2Vfc3RyZXNzIElOVEVHRVIsDQogICAgdGFyZ2V0X3ZlcnQgSU5URUdFUiwNCiAgICB0YXJnZXRfcm9hZF9pZCBJTlRFR0VSLA0KICAgIHRhcmdldF9yb2FkX2RpciBWQVJDSEFSKDIpLA0KICAgIHRhcmdldF9yb2FkX2F6aSBJTlRFR0VSLA0KICAgIHRhcmdldF9yb2FkX2xlbmd0aCBJTlRFR0VSLA0KICAgIHRhcmdldF9zdHJlc3MgSU5URUdFUiwNCiAgICBsaW5rX2Nvc3QgSU5URUdFUiwNCiAgICBsaW5rX3N0cmVzcyBJTlRFR0VSLA0KICAgIGdlb20gZ2VvbWV0cnkobGluZXN0cmluZyw/c2FfY3JzKQ0KKTsNCg0KLS0gY3JlYXRlIHZlcnRpY2VzDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IChyb2FkX2lkLCBnZW9tKQ0KU0VMRUNUICB3YXlzLnJvYWRfaWQsDQogICAgICAgIFNUX0xpbmVJbnRlcnBvbGF0ZVBvaW50KHdheXMuZ2VvbSwwLjUpDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgd2F5czsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3dheXNfbmV0X3ZlcnRfZ2VvbSBPTiByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IFVTSU5HIGdpc3QgKGdlb20pOw0KQ1JFQVRFIElOREVYIGlkeF9zYV93YXlzX25ldF92ZXJ0X3JvYWRpZCBPTiByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IChyb2FkX2lkKTsNCkFOQUxZWkUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydDsNCg0KLS0tLS0tLS0tLS0tLS0tDQotLSBhZGQgbGlua3MgLS0NCi0tLS0tLS0tLS0tLS0tLQ0KLS0gdHdvLXdheSB0byB0d28td2F5DQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgSU4gKHJvYWRzMS5pbnRlcnNlY3Rpb25fZnJvbSwgcm9hZHMxLmludGVyc2VjdGlvbl90bykNCkFORCAgICAgaW50cy5pbnRfaWQgSU4gKHJvYWRzMi5pbnRlcnNlY3Rpb25fZnJvbSwgcm9hZHMyLmludGVyc2VjdGlvbl90bykNCkFORCAgICAgcm9hZHMxLm9uZV93YXkgSVMgTlVMTA0KQU5EICAgICByb2FkczIub25lX3dheSBJUyBOVUxMDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSB0d28td2F5IHRvIGZyb20tdG8NCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCBJTiAocm9hZHMxLmludGVyc2VjdGlvbl9mcm9tLCByb2FkczEuaW50ZXJzZWN0aW9uX3RvKQ0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMi5pbnRlcnNlY3Rpb25fZnJvbQ0KQU5EICAgICByb2FkczEub25lX3dheSBJUyBOVUxMDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5ID0gJ2Z0Jw0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gdHdvLXdheSB0byB0by1mcm9tDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgSU4gKHJvYWRzMS5pbnRlcnNlY3Rpb25fZnJvbSwgcm9hZHMxLmludGVyc2VjdGlvbl90bykNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5IElTIE5VTEwNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgPSAndGYnDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSBmcm9tLXRvIHRvIHR3by13YXkNCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8NCkFORCAgICAgaW50cy5pbnRfaWQgSU4gKHJvYWRzMi5pbnRlcnNlY3Rpb25fZnJvbSwgcm9hZHMyLmludGVyc2VjdGlvbl90bykNCkFORCAgICAgcm9hZHMxLm9uZV93YXkgPSAnZnQnDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5IElTIE5VTEwNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIGZyb20tdG8gdG8gZnJvbS10bw0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMxLmludGVyc2VjdGlvbl90bw0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMi5pbnRlcnNlY3Rpb25fZnJvbQ0KQU5EICAgICByb2FkczEub25lX3dheSA9ICdmdCcNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgPSAnZnQnDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSBmcm9tLXRvIHRvIHRvLWZyb20NCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8NCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ2Z0Jw0KQU5EICAgICByb2FkczIub25lX3dheSA9ICd0ZicNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIHRvLWZyb20gdG8gdHdvLXdheQ0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMxLmludGVyc2VjdGlvbl9mcm9tDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMi5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczIub25lX3dheSBJUyBOVUxMDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSB0by1mcm9tIHRvIHRvLWZyb20NCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMS5pbnRlcnNlY3Rpb25fZnJvbQ0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMi5pbnRlcnNlY3Rpb25fdG8NCkFORCAgICAgcm9hZHMxLm9uZV93YXkgPSAndGYnDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gdG8tZnJvbSB0byBmcm9tLXRvDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczEuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgcm9hZHMxLm9uZV93YXkgPSAndGYnDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5ID0gJ2Z0Jw0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfdmVydF9yb2FkX2lkIE9OIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgKHJvYWRfaWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV93YXlzX25ldF9saW5rX2ludF9pZCBPTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV93YXlzX25ldF9saW5rX3NyY190cmd0IE9OIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKHNvdXJjZV92ZXJ0LHRhcmdldF92ZXJ0KTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfbGlua19zcmNfcmRpZCBPTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChzb3VyY2Vfcm9hZF9pZCk7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfbmV0X2xpbmtfdGd0X3JkaWQgT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAodGFyZ2V0X3JvYWRfaWQpOw0KQU5BTFlaRSByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rOw0KDQotLXNldCBzb3VyY2UgYW5kIHRhcmdldCByb2Fkcw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIHNvdXJjZV9yb2FkX2lkID0gc192ZXJ0LnJvYWRfaWQsDQogICAgICAgIHRhcmdldF9yb2FkX2lkID0gdF92ZXJ0LnJvYWRfaWQNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCBzX3ZlcnQsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdF92ZXJ0DQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3ZlcnQgPSBzX3ZlcnQudmVydF9pZA0KQU5EICAgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnRhcmdldF92ZXJ0ID0gdF92ZXJ0LnZlcnRfaWQ7DQoNCi0tc291cmNlX3JvYWRfZGlyDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgc291cmNlX3JvYWRfZGlyID0gQ0FTRSAgV0hFTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHJvYWQuaW50ZXJzZWN0aW9uX3RvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWQNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay5zb3VyY2Vfcm9hZF9pZCA9IHJvYWQucm9hZF9pZDsNCg0KLS10YXJnZXRfcm9hZF9kaXINClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICB0YXJnZXRfcm9hZF9kaXIgPSBDQVNFICBXSEVOIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuaW50X2lkID0gcm9hZC5pbnRlcnNlY3Rpb25fdG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2Z0Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICd0ZicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZA0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnRhcmdldF9yb2FkX2lkID0gcm9hZC5yb2FkX2lkOw0KDQotLXNldCBhemltdXRocyBhbmQgdHVybiBhbmdsZXMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBzb3VyY2Vfcm9hZF9hemkgPSBDQVNFICBXSEVOIHNvdXJjZV9yb2FkX2RpciA9ICd0ZicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBkZWdyZWVzKFNUX0F6aW11dGgoU1RfTGluZUludGVycG9sYXRlUG9pbnQocm9hZHMxLmdlb20sMC41KSxTVF9TdGFydFBvaW50KHJvYWRzMS5nZW9tKSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgZGVncmVlcyhTVF9BemltdXRoKFNUX0xpbmVJbnRlcnBvbGF0ZVBvaW50KHJvYWRzMS5nZW9tLDAuNSksU1RfRW5kUG9pbnQocm9hZHMxLmdlb20pKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICB0YXJnZXRfcm9hZF9hemkgPSBDQVNFICBXSEVOIHRhcmdldF9yb2FkX2RpciA9ICd0ZicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBkZWdyZWVzKFNUX0F6aW11dGgoU1RfU3RhcnRQb2ludChyb2FkczIuZ2VvbSksU1RfTGluZUludGVycG9sYXRlUG9pbnQocm9hZHMyLmdlb20sMC41KSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgZGVncmVlcyhTVF9BemltdXRoKFNUX0VuZFBvaW50KHJvYWRzMi5nZW9tKSxTVF9MaW5lSW50ZXJwb2xhdGVQb2ludChyb2FkczIuZ2VvbSwwLjUpKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICBzb3VyY2Vfcm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHRhcmdldF9yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQ7DQoNClVQREFURSByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIHR1cm5fYW5nbGUgPSAodGFyZ2V0X3JvYWRfYXppIC0gc291cmNlX3JvYWRfYXppICsgMzYwKSAlIDM2MDsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gc2V0IHR1cm4gaW5mbyAtLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXNzdW1lIGNyb3NzaW5nIGlzIHRydWUgdW5sZXNzIHByb3ZlbiBvdGhlcndpc2UNClVQREFURSByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIFNFVCBpbnRfY3Jvc3NpbmcgPSBUUlVFOw0KDQotLSBzZXQgcmlnaHQgdHVybnMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBpbnRfY3Jvc3NpbmcgPSBGQUxTRQ0KV0hFUkUgICBsaW5rX2lkID0gKA0KICAgICAgICAgICAgU0VMRUNUICAgICAgci5saW5rX2lkDQogICAgICAgICAgICBGUk9NICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIHINCiAgICAgICAgICAgIFdIRVJFICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByLnNvdXJjZV9yb2FkX2lkDQogICAgICAgICAgICBBTkQgICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHIuaW50X2lkDQogICAgICAgICAgICBPUkRFUiBCWSAgICAoc2luKHJhZGlhbnMoci50dXJuX2FuZ2xlKSk+MCk6OklOVCBERVNDLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ0FTRSAgICBXSEVOIHNpbihyYWRpYW5zKHIudHVybl9hbmdsZSkpPjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBjb3MocmFkaWFucyhyLnR1cm5fYW5nbGUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIC1jb3MocmFkaWFucyhyLnR1cm5fYW5nbGUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgQVNDDQogICAgICAgICAgICBMSU1JVCAgICAgICAxDQopOw0KDQotLXNldCBsZW5ndGhzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgc291cmNlX3JvYWRfbGVuZ3RoID0gU1RfTGVuZ3RoKHJvYWRzMS5nZW9tKSwNCiAgICAgICAgdGFyZ2V0X3JvYWRfbGVuZ3RoID0gU1RfTGVuZ3RoKHJvYWRzMi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgc291cmNlX3JvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB0YXJnZXRfcm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHNldCBsaW5rIHN0cmVzcyAtLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLXNvdXJjZV9zdHJlc3MNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBzb3VyY2Vfc3RyZXNzID0gQ0FTRSBXSEVOIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuaW50X2lkID0gcm9hZC5pbnRlcnNlY3Rpb25fdG8gVEhFTiByb2FkLmZ0X3NlZ19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0Ugcm9hZC50Zl9zZWdfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByb2FkLnJvYWRfaWQ7DQoNCi0taW50X3N0cmVzcw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIGludF9zdHJlc3MgPSByb2Fkcy5mdF9pbnRfc3RyZXNzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay5zb3VyY2Vfcm9hZF9pZCA9IHJvYWRzLnJvYWRfaWQNCkFORCAgICAgc291cmNlX3JvYWRfZGlyID0gJ2Z0JzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIGludF9zdHJlc3MgPSByb2Fkcy50Zl9pbnRfc3RyZXNzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay5zb3VyY2Vfcm9hZF9pZCA9IHJvYWRzLnJvYWRfaWQNCkFORCAgICAgc291cmNlX3JvYWRfZGlyID0gJ3RmJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIGludF9zdHJlc3MgPSAxDQpXSEVSRSAgIE5PVCBpbnRfY3Jvc3Npbmc7Ow0KDQotLXRhcmdldF9zdHJlc3MNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICB0YXJnZXRfc3RyZXNzID0gQ0FTRSAgICBXSEVOIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuaW50X2lkID0gcm9hZC5pbnRlcnNlY3Rpb25fdG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gcm9hZC50Zl9zZWdfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0Ugcm9hZC5mdF9zZWdfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWQNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay50YXJnZXRfcm9hZF9pZCA9IHJvYWQucm9hZF9pZDsNCg0KLS1saW5rX3N0cmVzcw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIGxpbmtfc3RyZXNzID0gR1JFQVRFU1Qoc291cmNlX3N0cmVzcyxpbnRfc3RyZXNzLHRhcmdldF9zdHJlc3MpOw0KDQotLS0tLS0tLS0tLS0tLQ0KLS0gc2V0IGNvc3QgLS0NCi0tLS0tLS0tLS0tLS0tDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgbGlua19jb3N0ID0gUk9VTkQoKHNvdXJjZV9yb2FkX2xlbmd0aCArIHRhcmdldF9yb2FkX2xlbmd0aCkgLyAyKTsNCg0KLS0gUmVtYXJrOiB3aGF0IGlzIHZlcnRfY29zdCBjcmVhdGVkIGFzIGEgY29sdW1uIG9uIHRoZSB2ZXJ0aWNlcyBpZiBpdCBpcyBub3QgZ29pbmcgdG8gYmUgdXNlZD8NCg0KU0VMRUNUICogRlJPTSByZWNlaXZlZC5zYV93YXlzIExJTUlUIDA7DQpgYGANCg0KIyMjIDguIEdlbmVyYXRlIHBvcHVsYXRpb24gZ3JpZA0KDQpTbywgdGhpcyBpcyBvbmUgb2YgdGhlIG1haW4gZGlmZmVyZW5jZXMgcmVnYXJkaW5nIHRoZSBQZkIgYXBwcm9hY2ggYW5kIG1pbmUuIEluc3RlYWQgb2YgdXNpbmcgVVMgY2Vuc3VzIGJsb2NrcyBJIHVzZWQgYSBwb3B1bGF0aW9uIGdyaWQgb2YgMSBrbV4yXiBmb3IgdGhlIGVudGlyZSBFdXJvcGVhbiB0ZXJyaXRvcnkuIFNpbmNlIGl0cyBhcmVhIGlzIHF1aXRlIGJpZywgSSBjcmVhdGVkIGEgc3ViZGl2aXNpb24gY29kZSB0byBzcGxpdCB0aGUgZGF0YSwgY29uc2lkZXJpbmcgcGFydGlhbCBwb3B1bGF0aW9ucyBmb3IgZWFjaCBuZXcgY2VsbCBkZXBlbmRpbmcgb24gdGhlIG1vdGhlciBjZWxsLiBUbyBkbyB0aGlzIEkgZm9sbG93ZWQgdHdvIHN0ZXBzOg0KDQojIyMjIC0gRG93bmxvYWQgZGF0YSBmcm9tIFtFVVJPU1RBVF0oaHR0cHM6Ly9lYy5ldXJvcGEuZXUvZXVyb3N0YXQvd2ViL2dpc2NvL2dlb2RhdGEvcmVmZXJlbmNlLWRhdGEvcG9wdWxhdGlvbi1kaXN0cmlidXRpb24tZGVtb2dyYXBoeS9nZW9zdGF0KSBhbmQgbG9hZCBpbnRvIERCDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQojIyBEb3dubG9hZCBkYXRhIGFuZCBsb2FkIHRvIFBvc3RncmVTUUwNCmlmICghZGJFeGlzdHNUYWJsZShjb25uZWN0aW9uLCBjKCJyZWNlaXZlZCIsImdlb3N0YXQiKSkpew0KICANCiAgIyBDUkVBVEUgQSBORVcgVEVNUE9SQUwgRElSRUNUT1JZIFRPIERPV05MT0FEIFRIRSBJTkZPDQogIGNkIDwtIGdldHdkKCkNCiAgaWZlbHNlKA0KICAgICFmaWxlLmV4aXN0cyhmaWxlLnBhdGgoY2QsJ3RlbXAnKSksDQogICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoY2QsJ3RlbXAnKSksIA0KICAgICJEaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiDQogICkNCiAgDQogICMgRVNUQUJMSVNIIFRIRSBOQU1FIE9GIFRIRSBGSUxFIFdIRVJFIFRIRSBHRU9TVEFUIERBVEEgV0lMTCBCRSBET1dOTE9BREVEIEFORCBVTlpJUFBFRA0KICBnZW9zdGF0X2ZpbGUgPC0gZmlsZS5wYXRoKGNkLCd0ZW1wJywnZ2Vvc3RhdC56aXAnKQ0KICBnZW9zdGF0X2V4ZGlyIDwtIGZpbGUucGF0aChjZCwidGVtcCIsImdlb3N0YXQiKQ0KICANCiAgaWYgKCFmaWxlLmV4aXN0cyhnZW9zdGF0X2V4ZGlyKSl7DQogICAgIyBERUZJTkUgVEhFIFVSTCBGUk9NIFdIRVJFIFRIRSBEQVRBIENPTUVTDQogIA0KICAgIGdlb3N0YXRfdXJsIDwtIA0KICAgICAgImh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L2NhY2hlL0dJU0NPL2dlb2RhdGFmaWxlcy9HRU9TVEFULWdyaWQtUE9QLTFLLTIwMTEtVjItMC0xLnppcCINCiAgICANCiAgICAjIERPV05MT0FEIFRIRSBGSUxFLCBVTlpJUCBJVCBBTkQgREVMRVRFIC5aSVANCiAgICANCiAgICBsaWJyYXJ5KHV0aWxzKQ0KICAgIGRvd25sb2FkLmZpbGUodXJsID0gZ2Vvc3RhdF91cmwsIGRlc3RmaWxlID0gZ2Vvc3RhdF9maWxlKQ0KICAgIHVuemlwKGdlb3N0YXRfZmlsZSwgZXhkaXIgPSBnZW9zdGF0X2V4ZGlyKQ0KICAgIGZpbGUucmVtb3ZlKGdlb3N0YXRfZmlsZSkNCiAgfQ0KICANCiAgIyBDQUxMIERBVEEgSU5UTyBSIEFORCBSRVBST0pFQ1QNCiAgbGlicmFyeShzZikNCiAgDQogIHRhYmxlX3BhdGggPC0gZmlsZS5wYXRoKA0KICAgIGdlb3N0YXRfZXhkaXIsDQogICAgIlZlcnNpb24gMl8wXzEvR0VPU1RBVF9ncmlkX1BPUF8xS18yMDExX1YyXzBfMS5jc3YiDQogICkNCiAgDQogIGdyaWRfcGF0aCA8LSBmaWxlLnBhdGgoDQogICAgZ2Vvc3RhdF9leGRpciwNCiAgICAiVmVyc2lvbiAyXzBfMS9HRU9TVEFUUmVmZXJlbmNlR3JpZC9HcmlkX0VUUlM4OV9MQUVBXzFLLXJlZl9HRU9TVEFUX1BPUF8yMDExX1YyXzBfMS5zaHAiDQogICkNCiAgDQogIHBvcF90YWJsZSA8LSBzdF9yZWFkKHRhYmxlX3BhdGgpDQogIG5hbWVzKHBvcF90YWJsZSkgPC0gcG9wX3RhYmxlICU+JSBuYW1lcygpICU+JSB0b2xvd2VyKCkNCiAgDQogIHBvcF9ncmlkIDwtIHN0X3JlYWQoZ3JpZF9wYXRoKQ0KICBwb3BfZ3JpZF90IDwtIHBvcF9ncmlkICU+JSBzdF90cmFuc2Zvcm0oY3JzID0gc2FfY3JzKQ0KICBuYW1lcyhwb3BfZ3JpZF90KSA8LSBwb3BfZ3JpZF90ICU+JSBuYW1lcygpICU+JSB0b2xvd2VyKCkNCiAgDQogICMgTE9BRCBUTyBQT1NUR1JFU1FMDQogIGxpYnJhcnkoc3FsZGYpDQogIHNxbGRmKA0KICAgICINCiAgRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQucG9wX2dyaWQ7DQogIERST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnBvcF90YWJsZTsNCiAgICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KICApDQogIA0KICBkYldyaXRlVGFibGUoDQogICAgY29ubiA9IGNvbm5lY3Rpb24sDQogICAgbmFtZSA9IGMoInJlY2VpdmVkIiwicG9wX2dyaWQiKSwNCiAgICB2YWx1ZSA9IHBvcF9ncmlkX3QNCiAgKQ0KICANCiAgZGJXcml0ZVRhYmxlKA0KICAgIGNvbm4gPSBjb25uZWN0aW9uLA0KICAgIG5hbWUgPSBjKCJyZWNlaXZlZCIsInBvcF90YWJsZSIpLA0KICAgIHZhbHVlID0gcG9wX3RhYmxlDQogICkNCiAgDQogICMjIyMgSm9pbiB0YWJsZXMgb24gZGF0YSBiYXNlIGFuZCBleHRyYWN0IHN0dWR5IGFyZWENCiAgDQogIHNxbGRmKA0KICAgICINCi0tIENyZWF0ZSBqb2luIGJldHdlZW4gLmNzdiBhbmQgLnNocA0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5nZW9zdGF0Ow0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuZ2Vvc3RhdF9nZW9tX2lkeDsNCg0KQ1JFQVRFIFRBQkxFIHJlY2VpdmVkLmdlb3N0YXQgQVMNCiBTRUxFQ1QgZ3JpZC5ncmRfaWQsIGdyaWQuZ2VvbWV0cnksIHRhYi50b3RfcCwgdGFiLmNudHJfY29kZSwgdGFiLnllYXIsIHRhYi50b3RfcF9jb25fZHQNCiAgICBGUk9NIHJlY2VpdmVkLnBvcF9ncmlkIGdyaWQsIHJlY2VpdmVkLnBvcF90YWJsZSB0YWINCiAgICBXSEVSRSBncmlkLmdyZF9pZCA9IHRhYi5ncmRfaWQ7DQoNCkNSRUFURSBJTkRFWCBnZW9zdGF0X2dlb21faWR4DQogIE9OIHJlY2VpdmVkLmdlb3N0YXQNCiAgVVNJTkcgZ2lzdA0KICAoZ2VvbWV0cnkpOw0KICANCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnBvcF9ncmlkOw0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQucG9wX3RhYmxlOw0KICAgICIsDQogICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCiAgKQ0KfSBlbHNlIHsNCiAgIkdFT1NUQVQgZGF0YSBhbHJlYWR5IGxvYWRlZCB0byBkYXRhYmFzZS4iDQp9DQpgYGANCg0KIyMjIyAtIEdlbmVyYXRlIHN1YmRpdmlzaW9uIHdpdGggYSBncmlkLCBhZGRpbmcgcGFydGlhbCBwb3B1bGF0aW9uIGFuZCB1bmlxdWUgSUQNCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCnNxbGRmOjpzcWxkZigNCiAgIg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZ2Vvc3RhdDsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2dlb3N0YXRfZ2VvbV9pZHg7DQoNCi0tIEV4dHJhY3QgdGhlIGdyaWRzIGNvbmNlcm5pbmcgb25seSB0aGUgc3R1ZHkgYXJlYQ0KDQpDUkVBVEUgVEFCTEUgcmVjZWl2ZWQuc2FfZ2Vvc3RhdCBBUw0KCVNFTEVDVCAJRElTVElOQ1QgZ2VvLmdyZF9pZCwgDQoJCQlDQVNUKGdlby50b3RfcCBBUyBJTlRFR0VSKSwgDQoJCQlnZW8uY250cl9jb2RlLCANCgkJCWdlby5nZW9tZXRyeQ0KCUZST00gcmVjZWl2ZWQuZ2Vvc3RhdCBnZW8sIHJlY2VpdmVkLnNhX3dheXMgdw0KIAlXSEVSRSBTVF9JbnRlcnNlY3RzKGdlby5nZW9tZXRyeSwgdy5nZW9tKTsNCg0KQ1JFQVRFIElOREVYIHNhX2dlb3N0YXRfZ2VvbV9pZHgNCiAgT04gcmVjZWl2ZWQuc2FfZ2Vvc3RhdA0KICBVU0lORyBnaXN0DQogIChnZW9tZXRyeSk7ICANCiAgIiwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24gDQopDQoNCiMjIEVzdGFibGlzaCBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSBncmlkIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBzdWJkaXZpc2lvbnMsIGRlZmF1bHRzIHRvIDkNCg0KZ3JpZCA8LSBmdW5jdGlvbihzID0gOSl7DQogICMjIENhbGwgaXQgYXMgYW4gc2Ygb2JqZWN0IGFuZCB0aGVuIHRyYW5zZm9ybSBpdCB0byBDUlM6MzAzNSB0byBjcmVhdGUgZ3JpZA0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KGRwbHlyLCBxdWlldGx5ID0gVFJVRSkNCiAgDQogIHNhX3BvcF8xa20yIDwtIHN0X3JlYWQoDQogICAgZHNuID0gY29ubmVjdGlvbiwNCiAgICBsYXllciA9IGMoInJlY2VpdmVkIiwgInNhX2dlb3N0YXQiKQ0KICApICU+JSANCiAgICBzdF90cmFuc2Zvcm0oY3JzID0gMzAzNSkNCiAgDQogICMjIERldGVybWluZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY2VsbHMNCiAgaCA8LSBhcy5pbnRlZ2VyKGFzLm51bWVyaWMoZGlmZihzdF9iYm94KHNhX3BvcF8xa20yKVtjKDEsIDMpXSkpLzEwMDApDQogIHYgPC0gYXMuaW50ZWdlcihhcy5udW1lcmljKGRpZmYoc3RfYmJveChzYV9wb3BfMWttMilbYygyLCA0KV0pKS8xMDAwKQ0KICANCiAgIyMgTWFrZSBncmlkDQogIGdyaWQgPC0gc2FfcG9wXzFrbTIgJT4lIA0KICAgIHN0X21ha2VfZ3JpZChuPWMoaCpzcXJ0KHMpLHYqc3FydChzKSksIHdoYXQgPSAicG9seWdvbnMiKSAlPiUNCiAgICBzdF9zZigpICU+JSANCiAgICBtdXRhdGUoaWQgPSAxOm4oKSkgJT4lIA0KICAgIHN0X2ludGVyc2VjdGlvbihzYV9wb3BfMWttMikNCiAgDQogICMjIEZpbHRlciBncmlkIGJ5IGFyZWEgb2YgaW50ZXJzZWN0aW9uIGJlY2F1c2UgdGhlcmUgYXJlIHNtYWxsIHBvbHlnb25zIGNyZWF0ZWQuDQogIA0KICBncmlkJGFyZWEgPC0gZ3JpZCAlPiUgc3RfZ2VvbWV0cnkoKSAlPiUgc3RfYXJlYSgpICU+JSBhcy5udW1lcmljKCkNCiAgDQogIGdyaWQgPC0gZ3JpZCAlPiUgZmlsdGVyKGFyZWEgPiAxKQ0KICANCiAgZ3JpZCRhcmVhIDwtIE5VTEwNCiAgDQogIGdyaWQgPC0gd2l0aGluKGdyaWQsIGNlbGxfaWQgPC0gcGFzdGUoZ3JkX2lkLCJDIixpZCwgc2VwID0gIiIpKQ0KICANCiAgZ3JpZCRpZCA8LSBOVUxMDQogIA0KICBncmlkJHBhcnRpYWxfcCA8LSBncmlkJHRvdF9wL3MNCiAgDQogIGdyaWQgJT4lIHN0X3RyYW5zZm9ybShjcnMgPSBzYV9jcnMpDQp9DQoNCnNhX2dyaWQgPC0gZ3JpZChzID0gc3ViZGl2aXNpb25zKSAjIEFsd2F5cyBjb25zaWRlciBhIHNxdWFyZWQgbnVtYmVyIHRvIG1ha2UgYW4gZXZlbiBkaXZpc2lvbg0KDQpzcWxkZjo6c3FsZGYoDQogICJEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KDQojIyBMb2FkIGRhdGEgaW50byBkYXRhIGJhc2UNClJQb3N0Z3JlU1FMOjpkYldyaXRlVGFibGUoDQogIGNvbm4gPSBjb25uZWN0aW9uLA0KICBuYW1lID0gYygiZ2VuZXJhdGVkIiwic2FfcG9wX2dyaWQiKSwNCiAgdmFsdWUgPSBzYV9ncmlkDQopDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQ9IDgsICBlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFfQ0KbGlicmFyeSh0bWFwKQ0KdG1hcF9tb2RlKCJ2aWV3IikNCnF0bSgNCiAgc2hwID0gc2FfZ3JpZCwgDQogIGZpbGwgPSBOVUxMLCANCiAgYm9yZGVycyA9ICJyZWQiLCANCiAgYmFzZW1hcHMgPSAiT3BlblN0cmVldE1hcCINCikNCmBgYA0KDQpQbG90dGluZyB0aGUgZ3JpZCBvbiB0aGlzIHN0ZXAgY2FuIGFsbG93IHRoZSBhbmFseXN0IGRlY2lkZSBvbiBhIGJldHRlciBudW1iZXIgb2Ygc3ViZGl2aXNpb25zLCBkZXBlbmRpbmcgb24gdGhlIHN0dWR5IGFyZWEuIEkgaG9wZSB0byBhdXRvbWF0aXplIHRoaXMgb24gYSBsYXRlciBlZmZvcnQuIA0KDQojIyMjIC0gUHJlcGFyZSB0aGUgcG9wdWxhdGlvbiBncmlkIHRhYmxlDQoNClRoaXMgc3RlcCBpcyBvbmx5IGdlbmVyYXRpbmcgbmV3IGNvbHVtbnMgb24gbXkgbmV3IFBvcHVsYXRpb24gR3JpZCB0YWJsZS4gSXQgZm9sbG93cyB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgUGZCIGFuZCB0aGVyZWZvcmUgd29uJ3QgYmUgaW5sY3VkZWQgb24gdGhpcyBkb2N1bWVudCBleHBsaWNpdGVseS4gDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgcm9hZF9pZHM7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBvcF9sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwb3BfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBvcF9zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgZW1wX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVtcF9oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgZW1wX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzY2hvb2xzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHNjaG9vbHNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHNjaG9vbHNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHVuaXZlcnNpdGllc19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29sbGVnZXNfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29sbGVnZXNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvbGxlZ2VzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkb2N0b3JzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRvY3RvcnNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRvY3RvcnNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRlbnRpc3RzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRlbnRpc3RzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkZW50aXN0c19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgaG9zcGl0YWxzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGhvc3BpdGFsc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgaG9zcGl0YWxzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwaGFybWFjaWVzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBoYXJtYWNpZXNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJldGFpbF9sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyByZXRhaWxfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJldGFpbF9zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHN1cGVybWFya2V0c19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc3VwZXJtYXJrZXRzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzb2NpYWxfc2VydmljZXNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBhcmtzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBhcmtzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwYXJrc19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhaWxzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYWlsc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhaWxzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29tbXVuaXR5X2NlbnRlcnNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYW5zaXRfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhbnNpdF9oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhbnNpdF9zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgb3ZlcmFsbF9zY29yZTsNCg0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcm9hZF9pZHMgSU5URUdFUltdOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcG9wX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcG9wX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHBvcF9zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGVtcF9sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGVtcF9oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBlbXBfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzY2hvb2xzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc2Nob29sc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzY2hvb2xzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHVuaXZlcnNpdGllc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbGxlZ2VzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gY29sbGVnZXNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gY29sbGVnZXNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkb2N0b3JzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZG9jdG9yc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkb2N0b3JzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZGVudGlzdHNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkZW50aXN0c19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkZW50aXN0c19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGhvc3BpdGFsc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGhvc3BpdGFsc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBob3NwaXRhbHNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwaGFybWFjaWVzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcmV0YWlsX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcmV0YWlsX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHJldGFpbF9zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHN1cGVybWFya2V0c19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzdXBlcm1hcmtldHNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc29jaWFsX3NlcnZpY2VzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGFya3NfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwYXJrc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwYXJrc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYWlsc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYWlsc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiB0cmFpbHNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbW11bml0eV9jZW50ZXJzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdHJhbnNpdF9sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYW5zaXRfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdHJhbnNpdF9zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIG92ZXJhbGxfc2NvcmUgRkxPQVQ7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCnNxbGRmKA0KICAiDQotLSBpbmRleGVzDQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc2FfcG9wX2dyaWRfY2VsbF9pZCBPTiBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgKGNlbGxfaWQpOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3BvcF9ncmlkX2dlb20gT04gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFVTSU5HIEdJU1QgKGdlb21ldHJ5KTsNCkFOQUxZWkUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KYGBgDQoNCmBgYHtzcWwgYWRkX3JvYWRfaWRzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFLCBvdXRwdXQudmFyID0gIm91dHB1dCJ9DQoNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdG1wX2dlb21fYnVmZmVyOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdG1wX2dlb21fYnVmZmVyIGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2Nycyk7DQoNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHRtcF9nZW9tX2J1ZmZlciA9IFNUX011bHRpKFNUX0J1ZmZlcihnZW9tZXRyeSw1KSk7DQpDUkVBVEUgSU5ERVggdHNpZHhfc2FfcG9wX2dyaWRfY2VsbGlkYnVmZmdlb21zIE9OIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBVU0lORyBHSVNUICh0bXBfZ2VvbV9idWZmZXIpOw0KQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgKHRtcF9nZW9tX2J1ZmZlcik7DQoNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHJvYWRfaWRzID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICB3YXlzLnJvYWRfaWQNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3YXlzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLnRtcF9nZW9tX2J1ZmZlcix3YXlzLmdlb20pDQogICAgICAgICAgICBBTkQgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNUX0NvbnRhaW5zKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC50bXBfZ2VvbV9idWZmZXIsd2F5cy5nZW9tKQ0KICAgICAgICAgICAgICAgICAgICBPUiAgU1RfTGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUX0ludGVyc2VjdGlvbihnZW5lcmF0ZWQuc2FfcG9wX2dyaWQudG1wX2dlb21fYnVmZmVyLHdheXMuZ2VvbSkNCiAgICAgICAgICAgICAgICAgICAgICAgICkgPiAxMA0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkpOw0KDQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRtcF9nZW9tX2J1ZmZlcjsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0Kc3FsZGYoDQogICINCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggYWlkeF9zYV9wb3BfZ3JpZF9yb2FkX2lkcyBPTiBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgVVNJTkcgR0lOIChyb2FkX2lkcyk7DQpBTkFMWVpFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCAocm9hZF9pZHMpOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KYGBgDQoNCiMjIyA5LiBSZWFjaGFibGUgcm9hZHMgc2NyaXB0cw0KDQpUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSB3aG9sZSBCTkEgYW5hbHlzaXMsIHdoZXJlIHRoZSBhY3R1YWwgbmV0d29yayBhbmFseXNpcyBpcyBwZXJmb3JtZWQuIFRoaXMgc3RlcCBtaWdodCB0YWtlIHNvbWUgY29tcHV0YXRpb24gdGltZS4gSXQgaXMgYWdhaW4gdGhlIHNhbWUgYXMgUGZCLCBhbmQgY2FuIGJlIHJldmlld2VkIHdpdGggbW9yZSBkZXRhaWwgb24gdGhlICpSbWQqIGZpbGUuIEl0IGJhc2ljYWxseSB1c2VzICpwZ3JvdXRpbmcqLCB0aGVyZWZvcmUgdGhlIERpamtzdHJhIGFsZ29yaXRobSB0byBjb21wdXRlIHRoZSAqKmRyaXZpbmcgZGlzdGFuY2UqKiBjb25zaWRlcmluZyB0aGUgY29uZmlndXJhdGlvbiBlc3RhYmxpc2hlZCBvbiBzdGVwIDcuIEl0IGRvZXMgaXQgZm9yIHRoZSB0d28gbGV2ZWxzIG9mIHRyYWZmaWMgc3RyZXNzOg0KDQojIyMjIyA+IEhpZ2ggc3RyZXNzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3M7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgYmFzZV9yb2FkIElOVCwNCiAgICB0YXJnZXRfcm9hZCBJTlQsDQogICAgdG90YWxfY29zdCBGTE9BVA0KKTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzOw0KYGBgDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKA0KICAgIGJhc2Vfcm9hZCwNCiAgICB0YXJnZXRfcm9hZCwNCiAgICB0b3RhbF9jb3N0DQopDQpTRUxFQ1QgIHIxLnJvYWRfaWQsDQogICAgICAgIHYyLnJvYWRfaWQsDQogICAgICAgIHNoZWRzLmFnZ19jb3N0DQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjIsDQogICAgICAgIHBncl9kcml2aW5nRGlzdGFuY2UoJw0KICAgICAgICAgICAgU0VMRUNUICBsaW5rX2lkIEFTIGlkLA0KICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdmVydCBBUyBzb3VyY2UsDQogICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJ0IEFTIHRhcmdldCwNCiAgICAgICAgICAgICAgICAgICAgbGlua19jb3N0IEFTIGNvc3QNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaycsDQogICAgICAgICAgICB2MS52ZXJ0X2lkLA0KICAgICAgICAgICAgP2Jpa2luZ19kaXN0YW5jZSwgLS12YWx1ZSB1c2VkIGluIFBmQiBhcHByb2FjaCwgbWlnaHQgY2hhbmdlIGxhdGVyLCBpdCBpcyBpbiBtZXRlcnMgYW5kIGFzc3VtZXMgYSBtYXggMTAgbWludXRlIHRyaXAgYXQgMTBtcGgNCiAgICAgICAgICAgIGRpcmVjdGVkIDo9IHRydWUNCiAgICAgICAgKSBzaGVkcw0KLS1XSEVSRSByMS5yb2FkX2lkICUgOnRocmVhZF9udW0gPSA6dGhyZWFkX25vDQotLUFORA0KV0hFUkUNCkVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGIuZ2VvbWV0cnkscjEuZ2VvbSkNCikNCkFORCAgICAgcjEucm9hZF9pZCA9IHYxLnJvYWRfaWQNCkFORCAgICAgdjIudmVydF9pZCA9IHNoZWRzLm5vZGU7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19oaWdoX3N0cmVzczsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpDUkVBVEUgVU5JUVVFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3JjaGJscmRzaGlzdHJzc19iIE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKGJhc2Vfcm9hZCwgdGFyZ2V0X3JvYWQpOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3JjaGJscmRzaGlzdHJzc190IE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKHRhcmdldF9yb2FkKTsNCg0KLS0gY2hlY2sgb24gdGhpcywgZG9lcyBub3Qgd29yayBnb29kIGJlY2F1c2U6IEtleSAoYmFzZV9yb2FkLCB0YXJnZXRfcm9hZCk9KDE3OTgsIDMxOTMpIGlzIGR1cGxpY2F0ZWQuDQpgYGANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KbGlicmFyeShzcWxkZikNCnNxbGRmKA0KICAiDQpWQUNVVU0gQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KDQojIyBJIHJ1biB0aGlzIHdpdGggdGhlIGxpYnJhcnkgYmVjYXVzZSBSIGRvZXMgbm90IGFsbG93IHNxbCBjb2RlIHdpdGhvdXQgc2VsZWN0IG91dHB1dA0KIyMgQWxzbywgU1FMIGRvZXMgbm90IGFsbG93IHRvIHJ1biBhIFZBQ1VVTSBBTkFMWVpFIGFzIGEgc2VyaWVzIG9mIHF1ZXJpZXMsIHNvIGl0IGhhcyB0byBiZSBhbG9uZS4gDQpgYGANCg0KIyMjIyMgPiBMb3cgc3RyZXNzDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3M7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBiYXNlX3JvYWQgSU5ULA0KICAgIHRhcmdldF9yb2FkIElOVCwNCiAgICB0b3RhbF9jb3N0IEZMT0FUDQopOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzczsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgKA0KICAgIGJhc2Vfcm9hZCwNCiAgICB0YXJnZXRfcm9hZCwNCiAgICB0b3RhbF9jb3N0DQopDQpTRUxFQ1QgIHIxLnJvYWRfaWQsDQogICAgICAgIHYyLnJvYWRfaWQsDQogICAgICAgIHNoZWRzLmFnZ19jb3N0DQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjIsDQogICAgICAgIHBncl9kcml2aW5nRGlzdGFuY2UoJw0KICAgICAgICAgICAgU0VMRUNUICBsaW5rX2lkIEFTIGlkLA0KICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdmVydCBBUyBzb3VyY2UsDQogICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJ0IEFTIHRhcmdldCwNCiAgICAgICAgICAgICAgICAgICAgbGlua19jb3N0IEFTIGNvc3QNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KICAgICAgICAgICAgV0hFUkUgICBsaW5rX3N0cmVzcyA9IDEnLA0KICAgICAgICAgICAgdjEudmVydF9pZCwNCiAgICAgICAgICAgID9iaWtpbmdfZGlzdGFuY2UsDQogICAgICAgICAgICBkaXJlY3RlZCA6PSB0cnVlDQogICAgICAgICkgc2hlZHMNCi0tV0hFUkUgcjEucm9hZF9pZCAlIDp0aHJlYWRfbnVtID0gOnRocmVhZF9ubw0KLS1BTkQNCldIRVJFDQpFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhiLmdlb21ldHJ5LHIxLmdlb20pDQopDQpBTkQgICAgIHIxLnJvYWRfaWQgPSB2MS5yb2FkX2lkDQpBTkQgICAgIHYyLnZlcnRfaWQgPSBzaGVkcy5ub2RlOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzczsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc2FfcmNoYmxyZHNsb3dzdHJzc19iIE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzcyAoYmFzZV9yb2FkKTsNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9zYV9yY2hibHJkc2xvd3N0cnNzX3QgT04gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzICh0YXJnZXRfcm9hZCk7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzOw0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCmxpYnJhcnkoc3FsZGYpDQpzcWxkZigNCiAgIg0KVkFDVVVNIEFOQUxZWkUgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzIChiYXNlX3JvYWQsdGFyZ2V0X3JvYWQpOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KDQojIyBJIHJ1biB0aGlzIHdpdGggdGhlIGxpYnJhcnkgYmVjYXVzZSBSIGRvZXMgbm90IGFsbG93IHNxbCBjb2RlIHdpdGhvdXQgc2VsZWN0IG91dHB1dA0KIyMgQWxzbywgU1FMIGRvZXMgbm90IGFsbG93IHRvIHJ1biBhIFZBQ1VVTSBBTkFMWVpFIGFzIGEgc2VyaWVzIG9mIHF1ZXJpZXMsIHNvIGl0IGhhcyB0byBiZSBhbG9uZS4gDQpgYGANCg0KIyMjIDEwLiBFc3RhYmxpc2ggY29ubmVjdGVkIHBvcHVsYXRpb24gZ3JpZHMgYW5kIGNvbXB1dGUgdGhlaXIgYWNjZXNzaWJpbGl0eQ0KDQpPbiB0aGlzIHN0ZXAgYmFzaWNhbGx5IGZvdXIgcHJvY2VkdXJlcyB0YWtlIHBsYWNlOg0KDQojIyMjIC0gQ29ubmVjdCBwb3B1bGF0aW9uIGdyaWRzDQoNCldoZXJlIGEgbmV3IHRhYmxlIGBzYV9jb25uZWN0ZWRfcG9wX2dyaWRgIGlzIGNyZWF0ZWQgdG8gc3VtbWFyaXplIHRoZSBjb25uZWN0ZWQgY2VsbHMgYnkgZXN0YWJsaXNoaW5nIHRoZW0gYXMgc291cmNlIGFuZCB0YXJnZXQsIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBjb25uZWN0ZWQgYnkgdGhlIGxvdyBvciBoaWdoIHN0cmVzcyBuZXR3b3JrLCBhbmQgb2J0YWluaW5nIHRoZSBtaW5pbXVtIHRoZSBjb3N0cyBiZXR3ZWVuIGNlbGxzLiANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZDsNCg0KQ1JFQVRFIFRBQkxFIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBzb3VyY2VfY2VsbGlkIFZBUkNIQVIoMTgpLA0KICAgIHRhcmdldF9jZWxsaWQgVkFSQ0hBUigxOCksDQogICAgbG93X3N0cmVzcyBCT09MRUFOLA0KICAgIGxvd19zdHJlc3NfY29zdCBJTlQsDQogICAgaGlnaF9zdHJlc3MgQk9PTEVBTiwNCiAgICBoaWdoX3N0cmVzc19jb3N0IElOVA0KKTsNCg0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCAoDQogICAgc291cmNlX2NlbGxpZCwgdGFyZ2V0X2NlbGxpZCwNCiAgICBsb3dfc3RyZXNzLCBsb3dfc3RyZXNzX2Nvc3QsIGhpZ2hfc3RyZXNzLCBoaWdoX3N0cmVzc19jb3N0DQopDQpTRUxFQ1QgIHNvdXJjZS5jZWxsX2lkLA0KICAgICAgICB0YXJnZXQuY2VsbF9pZCwNCiAgICAgICAgRkFMU0UsDQogICAgICAgICgNCiAgICAgICAgICAgIFNFTEVDVCAgTUlOKGxzLnRvdGFsX2Nvc3QpDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzcyBscw0KICAgICAgICAgICAgV0hFUkUgICBscy5iYXNlX3JvYWQgPSBBTlkoc291cmNlLnJvYWRfaWRzKQ0KICAgICAgICAgICAgQU5EICAgICBscy50YXJnZXRfcm9hZCA9IEFOWSh0YXJnZXQucm9hZF9pZHMpDQogICAgICAgICksDQogICAgICAgIFRSVUUsDQogICAgICAgICgNCiAgICAgICAgICAgIFNFTEVDVCAgTUlOKGhzLnRvdGFsX2Nvc3QpDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzcyBocyAtLVRoZXkgdGFrZSBpdCBmcm9tIHRoZSBsb3cgc3RyZXNzIGJlY2F1c2UgdGhlc2Ugcm9hZHMgY2FuIGFsc28gYmUgYWNjZXNzZWQgYnkgY2Fycy4gRG9pbmcgaXQgd2l0aCBoaWdoIHN0cmVzcyB0YWtlcyBhIGxvdCBvZiB0aW1lIGJlY2F1c2UgdGhleSBhcmUgbGlrZSAyIG1pbGxpb24gcmVjb3Jkcywgd2hpbGUgbG93IGFyZSAzMDAgdGhvdXNhbmQuIFRoaXMgaXMgd2h5IHRoZXkgdXBkYXRlIGFmdGVyd2FyZHMuIA0KICAgICAgICAgICAgV0hFUkUgICBocy5iYXNlX3JvYWQgPSBBTlkoc291cmNlLnJvYWRfaWRzKQ0KICAgICAgICAgICAgQU5EICAgICBocy50YXJnZXRfcm9hZCA9IEFOWSh0YXJnZXQucm9hZF9pZHMpDQogICAgICAgICkNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIHNvdXJjZSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIHRhcmdldCwNCiAgICAgICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkNCldIRVJFICAgU1RfSW50ZXJzZWN0cyhzb3VyY2UuZ2VvbWV0cnkscmVjZWl2ZWQuc2FfYm91bmRhcnkuZ2VvbWV0cnkpDQpBTkQgICAgIFNUX0RXaXRoaW4oc291cmNlLmdlb21ldHJ5LHRhcmdldC5nZW9tZXRyeSw/YmlraW5nX2Rpc3RhbmNlKTsNCg0KLS0gc2V0IGxvd19zdHJlc3MNClVQREFURSAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KU0VUICAgICBsb3dfc3RyZXNzID0gVFJVRQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBzb3VyY2UsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCB0YXJnZXQNCiAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gc291cmNlLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gdGFyZ2V0LmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgc291cmNlLnJvYWRfaWRzICYmIHRhcmdldC5yb2FkX2lkcw0KICAgICAgICApDQpPUiAgICAgICgNCiAgICAgICAgICAgIGxvd19zdHJlc3NfY29zdCBJUyBOT1QgTlVMTA0KICAgICAgICBBTkQgQ0FTRSAgICBXSEVOIENPQUxFU0NFKGhpZ2hfc3RyZXNzX2Nvc3QsMCkgPSAwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICBFTFNFIGxvd19zdHJlc3NfY29zdDo6RkxPQVQgLyBoaWdoX3N0cmVzc19jb3N0IDw9IDEuMjUNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICk7DQogICAgICAgIA0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHNxbGRmKQ0Kc3FsZGYoDQogICINCi0tIGluZGV4ZXMNCkNSRUFURSBVTklRVUUgSU5ERVggaWR4X3NhX2NlbGxwYWlycyBPTiBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIChzb3VyY2VfY2VsbGlkLHRhcmdldF9jZWxsaWQpOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX2NlbGxwYWlyc19sc3RyZXNzIE9OIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgKGxvd19zdHJlc3MpIFdIRVJFIGxvd19zdHJlc3MgSVMgVFJVRTsNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9zYV9jZWxscGFpcnNfaHN0cmVzcyBPTiBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIChoaWdoX3N0cmVzcykgV0hFUkUgaGlnaF9zdHJlc3MgSVMgVFJVRTsNCkFOQUxZWkUgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZDsNCiAgIiwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCikNCiMjIEkgcnVuIHRoaXMgd2l0aCB0aGUgbGlicmFyeSBiZWNhdXNlIFIgZG9lcyBub3QgYWxsb3cgc3FsIGNvZGUgd2l0aG91dCBzZWxlY3Qgb3V0cHV0DQojIyBBbHNvLCBTUUwgZG9lcyBub3QgYWxsb3cgdG8gcnVuIGEgVkFDVVVNIEFOQUxZWkUgYXMgYSBzZXJpZXMgb2YgcXVlcmllcywgc28gaXQgaGFzIHRvIGJlIGFsb25lLiANCmBgYA0KDQojIyMjIC0gQ29tcHV0ZSBwb3B1bGF0aW9uIGFjY2Vzcw0KDQpUaGUgYWNjZXNzIGNvbXB1dGF0aW9uIG9uIHRoaXMgc3RlcCBmaWxscyB1cCB0aGUgYHNhX3BvcF9ncmlkYCB0YWJsZSBjcmVhdGVkIG9uICpzdGVwIDgqLCBhY2NvcmRpbmcgdG8gdGhlIFtQZkIgbWV0aG9kb2xvZ3ldKGh0dHBzOi8vYm5hLnBlb3BsZWZvcmJpa2VzLm9yZy8jL21ldGhvZG9sb2d5KS4NCg0KVG8gY29tcHV0ZSBhY2Nlc3Mgb24gdGhpcyBhbiB0aGUgbmV4dCBzdGVwLCBhIHdlaWdodGluZyBwcm9jZWR1cmUgaXMgdXNlZCwgYXMgdGhlIG1ldGhvZG9sb2d5IG9mIFBmQiBkb2VzLCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgW2hlcmVdKGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9wZmItcHVibGljLWRvY3VtZW50cy9TY29yaW5nLmNhdGVnb3JpZXMueGxzeCkuIA0KDQpBIHF1aWNrIGdsYW5jZSBvZiB0aGUgd2VpZ2h0cyB1c2VkLCBtYWlubHkgZm9yICpzdGVwIDExKjoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KdGJsIDwtIGRhdGEuZnJhbWUoDQogIHNjb3JjYXQgPSBjZWxsX3NwZWMoDQogICAgYygNCiAgICAgIHJlcCgiUGVvcGxlID0gMTUiLDEpLA0KICAgICAgcmVwKCJPcHBvcnR1bml0eSA9IDIwIiw0KSwNCiAgICAgIHJlcCgiQ29yZSBTZXJ2aWNlcyA9IDIwIiw2KSwNCiAgICAgIHJlcCgiUmVjcmVhdGlvbiA9IDE1IiwzKSwNCiAgICAgIHJlcCgiUmV0YWlsID0gMTUiLDEpLA0KICAgICAgcmVwKCJUcmFuc2l0ID0gMTUiLDEpDQogICAgKQ0KICApLA0KICBtZWFzdXJlID0gY2VsbF9zcGVjKA0KICAgIGMoDQogICAgICAiUG9wdWxhdGlvbiA9IE4vQSIsDQogICAgICAiRW1wbG95bWVudCA9IDM1IiwNCiAgICAgICJLLTEyIEVkdWNhdGlvbiA9IDM1IiwNCiAgICAgICJUZWNobmljYWwvdm9jYXRpb25hbCBzY2hvb2wgPSAxMCIsDQogICAgICAiSGlnaGVyIEVkdWNhdGlvbiA9IDIwIiwNCiAgICAgICJEb2N0b3Igb2ZmaWNlcy9jbGluaWNzID0gMjAiLA0KICAgICAgIkRlbnRpc3Qgb2ZmaWNlcyA9IDEwIiwNCiAgICAgICJIb3NwaXRhbHMgPSAyMCIsDQogICAgICAiUGhhcm1hY2llcyA9IDEwIiwNCiAgICAgICJTdXBlcm1hcmtldHMgPSAyNSIsDQogICAgICAiU29jaWFsIHNlcnZpY2VzID0gMTUiLA0KICAgICAgIlBhcmtzID0gNDAiLA0KICAgICAgIlJlY3JlYXRpb25hbCB0cmFpbHMgPSAzNSIsDQogICAgICAiQ29tbXVuaXR5IGNlbnRlcnMgPSAyNSIsDQogICAgICAiUmV0YWlsIHNob3BwaW5nID0gTi9BIiwNCiAgICAgICJTdGF0aW9uL3RyYW5zaXQgY2VudGVycyA9IE4vQSINCiAgICApDQogICkNCikNCg0KY29sbmFtZXModGJsKSA8LSBjKCJTY29yaW5nIENhdGVnb3J5IiwgIk1lYXN1cmUiKQ0KDQprYWJsZSh0YmwsIGFsaWduID0gImMiLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCAiYm9yZGVyZWQiLCBmb250X3NpemUgPSAxMCwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxLCB2YWxpZ24gPSAidG9wIikNCmBgYA0KDQpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgcmVwcm9kdWN0aW9uIG9mIHRoZSBCTkEgZm9yIEV1cm9wZSBkb2VzIG5vdCBpbmNsdWRlICplbXBsb3ltZW50KiBkYXRhLCBhcyB1bnRpbCBub3csIEkgaGF2ZSBub3QgbG9jYXRlZCBhIHNvdXJjZSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gYXMgb3BlbiBkYXRhIGZvciB0aGUgd2hvbGUgRXVyb3BlLiBUaGVyZWZvcmUsIHRoZSBmaW5hbCByZXN1bHRzIHdpbGwgc2hvdyB0aGlzIGNhdGVnb3J5IGJ1dCB3aXRoIDAgb3IgTkEgdmFsdWVzLiANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCiMjIEVzdGFibGlzaCB2YXJpYWJsZXMgdG8gZ2l2ZSBzY29yZXMgdG8gcG9wdWxhdGlvbiBhY2Nlc3MuIA0KbWF4X3Njb3JlID0gMQ0Kc3RlcDEgPSAwLjAzDQpzY29yZTEgPSAwLjENCnN0ZXAyID0gMC4yDQpzY29yZTIgPSAwLjQNCnN0ZXAzID0gMC41DQpzY29yZTMgPSAwLjgNCmBgYA0KDQpgYGB7c3FsIHBvcCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gbG93IHN0cmVzcyBhY2Nlc3MNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oYmxvY2tzMi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBibG9ja3MyDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBjYi5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgY2IudGFyZ2V0X2NlbGxpZCA9IGJsb2NrczIuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBjYi5sb3dfc3RyZXNzDQogICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGJsb2NrczIucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgYmxvY2tzMg0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2INCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgY2Iuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGNiLnRhcmdldF9jZWxsaWQgPSBibG9ja3MyLmNlbGxfaWQNCiAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gcG9wX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgIFdIRU4gP3N0ZXAxID0gMCBUSEVOID9tYXhfc2NvcmUgKiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPSA/c3RlcDMgVEhFTiA/c2NvcmUzDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzID0gP3N0ZXAyIFRIRU4gP3Njb3JlMg0KICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcyA9ID9zdGVwMSBUSEVOID9zY29yZTENCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPiA/c3RlcDMNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP3Njb3JlMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICg/bWF4X3Njb3JlIC0gP3Njb3JlMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzIC0gP3N0ZXAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMSAtID9zdGVwMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcyA+ID9zdGVwMg0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/c2NvcmUyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKD9zY29yZTMgLSA/c2NvcmUyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgLSA/c3RlcDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICg/c3RlcDMgLSA/c3RlcDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPiA/c3RlcDENCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP3Njb3JlMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICg/c2NvcmUyIC0gP3Njb3JlMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzIC0gP3N0ZXAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoP3N0ZXAyIC0gP3N0ZXAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgID9zY29yZTENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyA/c3RlcDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBFTkQ7DQogICAgICAgICAgICAgICAgICAgIA0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7ICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQojIyMjIC0gRXh0cmFjdCBjb21tb24gZGVzdGluYXRpb25zIA0KDQpXaGljaCB1c2VzIHRoZSBvc20gcG9seWdvbnMgYW5kIHBvaW50cyBnZW5lcmF0ZWQgYnkgYG9zbTJwZ3NxbGAuIFRoZSBkZXN0aW5hdGlvbnMgaW5jbHVkZWQgYXJlOg0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0KY2x1c3Rlcl9jb2xsZWdlcyA9IDEwMA0KY2x1c3Rlcl9jb21tdW5pdHlfY2VudGVycyA9IDUwDQpjbHVzdGVyX2RvY3RvcnMgPSA1MA0KY2x1c3Rlcl9kZW50aXN0cyA9IDUwDQpjbHVzdGVyX2hvc3BpdGFscyA9IDUwDQpjbHVzdGVyX3BoYXJtYWNpZXMgPSA1MA0KY2x1c3Rlcl9wYXJrcyA9IDUwDQpjbHVzdGVyX3JldGFpbCA9IDUwDQpjbHVzdGVyX3RyYW5zaXQgPSA3NQ0KY2x1c3Rlcl91bml2ZXJzaXRpZXMgPSAxNTANCmBgYA0KDQojIyMjIyA+IENvbGxlZ2VzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGNlbGxfaWQgQ0hBUkFDVEVSIFZBUllJTkcoMTgpW10sDQogICAgb3NtX2lkIEJJR0lOVCwNCiAgICBjb2xsZWdlX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9jb2xsZWdlcykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdjb2xsZWdlJzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9jb2xsZWdlc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoDQogICAgb3NtX2lkLCBjb2xsZWdlX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ2NvbGxlZ2UnDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyBzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMocy5nZW9tX3BvbHkscmVjZWl2ZWQuc2FfZnVsbF9wb2ludC53YXkpDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9jb2xsZWdlc19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMgKGdlb21fcHQpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGNiLmdlb21ldHJ5KQ0KICAgICAgICApKTsNCg0KLS0gYmxvY2sgaW5kZXgNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGFpZHhfZGVzdGluYXRpb25zX3NhX2NvbGxlZ2VzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzOw0KYGBgDQoNCiMjIyMjID4gQ29tbXVuaXR5IGNlbnRlcnMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgY2VudGVyX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9jb21tdW5pdHlfY2VudGVycykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSBJTiAoJ2NvbW11bml0eV9jZW50cmUnLCdjb21tdW5pdHlfY2VudGVyJyk7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfY29tbXVuaXR5X2NlbnRlcnNfZ2VvbXBseSBPTiBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgKA0KICAgIG9zbV9pZCwgY2VudGVyX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5IElOICgnY29tbXVuaXR5X2NlbnRyZScsJ2NvbW11bml0eV9jZW50ZXInKQ0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfY29tbXVuaXR5X2NlbnRlcnNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2NvbW11bml0eV9jZW50ZXJzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzOw0KYGBgDQoNCiMjIyMjID4gRGVudGlzdHMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIGRlbnRpc3RzX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9kZW50aXN0cykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdkZW50aXN0JzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9kZW50aXN0c19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyAoDQogICAgb3NtX2lkLCBkZW50aXN0c19uYW1lLCBnZW9tX3B0DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQNCldIRVJFICAgYW1lbml0eSA9ICdkZW50aXN0Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfZGVudGlzdHNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2RlbnRpc3RzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzOw0KDQpgYGANCg0KIyMjIyMgPiBEb2N0b3JzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgZG9jdG9yc19uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShtdWx0aXBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9kb2N0b3JzKSksMyksMCkpDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBhbWVuaXR5IElOICgnY2xpbmljJywnZG9jdG9ycycpOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfZG9jdG9yc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycyAoDQogICAgb3NtX2lkLCBkb2N0b3JzX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5IElOICgnY2xpbmljJywnZG9jdG9ycycpDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX2RvY3RvcnNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RvY3RvcnMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9kb2N0b3JzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfZG9jdG9yczsNCmBgYA0KDQojIyMjIyA+IEhvc3BpdGFscyANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFsczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgaG9zcGl0YWxfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9ob3NwaXRhbHMpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgSU4gKCdob3NwaXRhbHMnLCdob3NwaXRhbCcpOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9ob3NwaXRhbHNfZ2VvbXBseSBPTiBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKA0KICAgIG9zbV9pZCwgaG9zcGl0YWxfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgIGFtZW5pdHkgSU4gKCdob3NwaXRhbHMnLCdob3NwaXRhbCcpDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfaG9zcGl0YWxzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2hvc3BpdGFsc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscyAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHM7DQpgYGANCg0KIyMjIyMgPiBQYXJrcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfcGFya3M7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfcGFya3MgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgcGFya19uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShtdWx0aXBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoDQogICAgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIFNUX011bHRpKFNUX0J1ZmZlcihTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfcGFya3MpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAncGFyaycNCiAgICAgICAgT1IgbGVpc3VyZSA9ICdwYXJrJw0KICAgICAgICBPUiBsZWlzdXJlID0gJ25hdHVyZV9yZXNlcnZlJw0KICAgICAgICBPUiBsZWlzdXJlID0gJ3BsYXlncm91bmQnOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBnZW9tX3B0ID0gU1RfQ2VudHJvaWQoZ2VvbV9wb2x5KTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3BhcmtzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3BhcmtzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoZ2VvbV9wb2x5KTsNCg0KLS0gaW5zZXJ0IHBvaW50cw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3BhcmtzICgNCiAgICBvc21faWQsIHBhcmtfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgICgNCiAgICAgICAgICAgIGFtZW5pdHkgPSAncGFyaycNCiAgICAgICAgT1IgIGxlaXN1cmUgPSAncGFyaycNCiAgICAgICAgT1IgIGxlaXN1cmUgPSAnbmF0dXJlX3Jlc2VydmUnDQogICAgICAgIE9SICBsZWlzdXJlID0gJ3BsYXlncm91bmQnDQogICAgICAgICkNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3BhcmtzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3BhcmtzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfcGFya3MgVVNJTkcgR0lTVCAoZ2VvbV9wdCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICAgICBPUiAgICAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9wYXJrc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyBVU0lORyBHSU4gKGNlbGxfaWQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfcGFya3MgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfcGFya3M7DQpgYGANCg0KIyMjIyMgPiBQaGFybWFjaWVzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgcGhhcm1hY3lfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyAoDQogICAgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIFNUX011bHRpKFNUX0J1ZmZlcihTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfcGhhcm1hY2llcykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdwaGFybWFjeSc7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9waGFybWFjaWVzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzICgNCiAgICBvc21faWQsIHBoYXJtYWN5X25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ3BoYXJtYWN5Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyBzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMocy5nZW9tX3BvbHkscmVjZWl2ZWQuc2FfZnVsbF9wb2ludC53YXkpDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9waGFybWFjaWVzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKGdlb21fcHQpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGNiLmdlb21ldHJ5KQ0KICAgICAgICApKTsNCg0KLS0gYmxvY2sgaW5kZXgNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGFpZHhfc2FfcGhhcm1hY2llc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzIChjZWxsX2lkKTsNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXM7DQpgYGANCg0KIyMjIyMgPiBSZXRhaWwNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX3JldGFpbDsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0DQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9yZXRhaWwpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGxhbmR1c2UgPSAncmV0YWlsJzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfcmV0YWlsX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3JldGFpbCBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsIChnZW9tX3BvbHkpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9yZXRhaWxfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsOw0KYGBgDQoNCiMjIyMjID4gU2Nob29scw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2Ffc2Nob29sczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHNjaG9vbF9uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvaW50cyBmcm9tIHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scyAoDQogICAgb3NtX2lkLCBzY2hvb2xfbmFtZSwgZ2VvbV9wdCwgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgU1RfQ2VudHJvaWQod2F5KSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBhbWVuaXR5ID0gJ3NjaG9vbCc7DQoNCi0tIHJlbW92ZSBzdWJhcmVhcyB0aGF0IGFyZSBtaXN0YWtlbmx5IGRlc2lnbmF0ZWQgYXMgYW1lbml0eT1zY2hvb2wNCkRFTEVURSBGUk9NIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3BvbHkpDQogICAgICAgICAgICBBTkQgICAgIHMuaWQgIT0gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuaWQNCik7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9zY2hvb2xzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzICgNCiAgICBvc21faWQsIHNjaG9vbF9uYW1lLCBnZW9tX3B0DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQNCldIRVJFICAgYW1lbml0eSA9ICdzY2hvb2wnDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3NjaG9vbHNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zY2hvb2xzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc2Nob29sczsNCmBgYA0KDQojIyMjIyA+IFNvY2lhbCBzZXJ2aWNlcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGNlbGxfaWQgQ0hBUkFDVEVSIFZBUllJTkcoMTgpW10sDQogICAgb3NtX2lkIEJJR0lOVCwNCiAgICBzZXJ2aWNlX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KHBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9pbnRzIGZyb20gcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgKA0KICAgIG9zbV9pZCwgc2VydmljZV9uYW1lLCBnZW9tX3B0LCBnZW9tX3BvbHkNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICBTVF9DZW50cm9pZCh3YXkpLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAnc29jaWFsX2ZhY2lsaXR5JzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzIHRoYXQgYXJlIGFscmVhZHkgY292ZXJlZA0KREVMRVRFIEZST00gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcG9seSkNCiAgICAgICAgICAgIEFORCAgICAgcy5pZCAhPSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2Ffc29jaWFsX3NlcnZpY2VzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzICgNCiAgICBvc21faWQsIHNlcnZpY2VfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgIGFtZW5pdHkgPSAnc29jaWFsX2ZhY2lsaXR5Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3NvY2lhbF9zZXJ2aWNlc19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zb2NpYWxfc2VydmljZXNfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzOw0KYGBgDQoNCiMjIyMjID4gU3VwZXJtYXJrZXRzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHN1cGVybWFya2V0X25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KHBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9pbnRzIGZyb20gcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgKA0KICAgIG9zbV9pZCwgc3VwZXJtYXJrZXRfbmFtZSwgZ2VvbV9wdCwgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgU1RfQ2VudHJvaWQod2F5KSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBzaG9wID0gJ3N1cGVybWFya2V0JzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzIHRoYXQgYXJlIGFscmVhZHkgY292ZXJlZA0KREVMRVRFIEZST00gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcG9seSkNCiAgICAgICAgICAgIEFORCAgICAgcy5pZCAhPSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2Ffc3VwZXJtYXJrZXRzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzICgNCiAgICBvc21faWQsIHN1cGVybWFya2V0X25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBzaG9wID0gJ3N1cGVybWFya2V0Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3N1cGVybWFya2V0c19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zdXBlcm1hcmtldHNfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzOw0KYGBgDQoNCiMjIyMjID4gVHJhbnNpdA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdDsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0ICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHRyYW5zaXRfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkocG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2ludHMgZnJvbSBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgKA0KICAgIG9zbV9pZCwgdHJhbnNpdF9uYW1lLCBnZW9tX3B0LCBnZW9tX3BvbHkNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICBTVF9DZW50cm9pZCh3YXkpLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAnYnVzX3N0YXRpb24nDQpPUiAgICAgIHJhaWx3YXkgPSAnc3RhdGlvbicNCk9SICAgICAgcHVibGljX3RyYW5zcG9ydCA9ICdzdGF0aW9uJzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzDQpERUxFVEUgRlJPTSBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfQ29udGFpbnMocy5nZW9tX3BvbHksZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wb2x5KQ0KICAgICAgICAgICAgQU5EICAgICBzLmlkICE9IGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdHJhbnNpdF9nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCAoDQogICAgZ2VvbV9wdA0KKQ0KU0VMRUNUICBTVF9DZW50cm9pZChTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfdHJhbnNpdCkpLDEpKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgICgNCiAgICAgICAgICAgIGFtZW5pdHkgPSAnYnVzX3N0YXRpb24nDQogICAgICAgIE9SICByYWlsd2F5ID0gJ3N0YXRpb24nDQogICAgICAgIE9SICBwdWJsaWNfdHJhbnNwb3J0ID0gJ3N0YXRpb24nDQogICAgICAgICkNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9EV2l0aGluKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5LDUwKQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdHJhbnNpdF9nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgVVNJTkcgR0lTVCAoZ2VvbV9wdCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICAgICBPUiAgICAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX3RyYW5zaXRfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCBVU0lORyBHSU4gKGNlbGxfaWQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Ow0KYGBgDQoNCiMjIyMjID4gVW5pdmVyc2l0aWVzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIGNvbGxlZ2VfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl91bml2ZXJzaXRpZXMpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAndW5pdmVyc2l0eSc7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KU0VUICAgICBnZW9tX3B0ID0gU1RfQ2VudHJvaWQoZ2VvbV9wb2x5KTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3VuaXZlcnNpdGllc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoZ2VvbV9wb2x5KTsNCg0KLS0gaW5zZXJ0IHBvaW50cw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoDQogICAgb3NtX2lkLCBjb2xsZWdlX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ3VuaXZlcnNpdHknDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdW5pdmVyc2l0aWVzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX3VuaXZlcnNpdGllc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXM7DQpgYGANCg0KIyMjIyAtIENvbXB1dGUgYWNjZXNzIHRvIGNvbW1vbiBkZXN0aW5hdGlvbnMNCg0KV2hlcmUgdGhlIGFjY2VzcyB0byB0aGUgZGVzdGluYXRpb25zIGVzdGFibGlzaGVkIGJlZm9yZSBpcyBjb21wdXRlZC4gQWNjZXNzIHRvIHJlY3JlYXRpb25hbCB0cmFpbHMgYW5kIGJpa2UgcGF0aHMgaXMgYWxzbyBpbmNsdWRlZC4NCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KDQptYXhfc2NvcmUgPSAxDQoNCiMjIFNjb3JlcyBmaXJzdCBncm91cDogY29sbGVnZXMsIGhvc3BpdGFscywgc29jaWFsIHNlcnZpY2VzLCB1bml2ZXJzaXRpZXMNCkFmaXJzdCA9IDAuNw0KQXNlY29uZCA9IDANCkF0aGlyZCA9IDANCg0KIyMgU2NvcmVzIHNlY29uZCBncm91cDogY29tbXVuaXR5IGNlbnRlcnMsIGRlbnRpc3RzLCBwaGFybWFjaWVzLCByZXRhaWwNCkJmaXJzdCA9IDAuNCANCkJzZWNvbmQgPSAwLjIgDQpCdGhpcmQgPSAwLjEgDQoNCiMjIFNjb3JlcyB0aGlyZCBncm91cDogcGFya3MsIHNjaG9vbHMNCkNmaXJzdCA9IDAuMyANCkNzZWNvbmQgPSAwLjIgDQpDdGhpcmQgPSAwLjIgDQoNCiMjIFNjb3JlcyBmb3VydGggZ3JvdXA6IHN1cGVybWFya2V0cw0KRGZpcnN0ID0gMC42IA0KRHNlY29uZCA9IDAuMiANCkR0aGlyZCA9IDANCg0KIyMgU2NvcmVzIGZpZnRoIGdyb3VwOiB0cmFpbHMNCkVmaXJzdCA9IDAuNyANCkVzZWNvbmQgPSAwLjIgDQpFdGhpcmQgPSAwDQptaW5fcGF0aF9sZW5ndGg9NDgwMCANCm1pbl9iYm94X2xlbmd0aD0zMzAwIA0KDQojIyBTY29yZXMgc2l4dGggZ3JvdXA6IHRyYW5zaXQNCkZmaXJzdCA9IDAuNiANCkZzZWNvbmQgPSAwIA0KRnRoaXJkID0gMA0KDQpgYGANCg0KYGBge3NxbCBjb2xsZWdlcywgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBjb2xsZWdlc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBjb2xsZWdlc19zY29yZSA9ICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzID0gY29sbGVnZXNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BZmlyc3QgPSAwIFRIRU4gY29sbGVnZXNfbG93X3N0cmVzczo6RkxPQVQgLyBjb2xsZWdlc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCkgKiAoY29sbGVnZXNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb2xsZWdlc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQpICogKGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb2xsZWdlc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19sb3dfc3RyZXNzID0gMiBUSEVOID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QgLSA/QXNlY29uZCAtID9BdGhpcmQpICogKGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb2xsZWdlc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIGNvbGxlZ2UgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQoNCmBgYHtzcWwgY29tY2VuLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIGNvbW11bml0eV9jZW50ZXJzX3Njb3JlID0gICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID0gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JmaXJzdCA9IDAgVEhFTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVCAvIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0KSAqIChjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kKSAqIChjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kIC0gP0J0aGlyZCkgKiAoY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggY29tbXVuaXR5IGNlbnRlciBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgZGVudGlzdCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkZW50aXN0c19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkZW50aXN0c19zY29yZSA9ICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID0gZGVudGlzdHNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CZmlyc3QgPSAwIFRIRU4gZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQgLyBkZW50aXN0c19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCkgKiAoZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkZW50aXN0c19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQpICogKGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkZW50aXN0c19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QgLSA/QnNlY29uZCAtID9CdGhpcmQpICogKGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkZW50aXN0c19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIGRlbnRpc3RzIGRlc3RpbmF0aW9uIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBkb2N0b3JzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiICwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkb2N0b3JzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIGRvY3RvcnNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkb2N0b3JzX3Njb3JlID0gQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzID0gZG9jdG9yc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QmZpcnN0ID0gMCBUSEVOIGRvY3RvcnNfbG93X3N0cmVzczo6RkxPQVQgLyBkb2N0b3JzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0KSAqIChkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkb2N0b3JzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0J0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQpICogKGRvY3RvcnNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZG9jdG9yc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kIC0gP0J0aGlyZCkgKiAoZG9jdG9yc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkb2N0b3JzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIGRvY3RvcnMgZGVzdGluYXRpb24gaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBob3NwaXRhbHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgaG9zcGl0YWxzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgaG9zcGl0YWxzX3Njb3JlID0gICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGhvc3BpdGFsc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPSBob3NwaXRhbHNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BZmlyc3QgPSAwIFRIRU4gaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUIC8gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0KSAqIChob3NwaXRhbHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChob3NwaXRhbHNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0F0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQpICogKGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGhvc3BpdGFsc19sb3dfc3RyZXNzID0gMyBUSEVOID9BZmlyc3QgKyA/QXNlY29uZCArID9BdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZCArID9BdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kIC0gP0F0aGlyZCkgKiAoaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChob3NwaXRhbHNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBob3NwaXRhbHMgZGVzdGluYXRpb24gaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgcGFya3MsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgcGFya3NfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBwYXJrc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgcGFya3Nfc2NvcmUgPSAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwYXJrc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgPSBwYXJrc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/Q2ZpcnN0ID0gMCBUSEVOIHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUIC8gcGFya3NfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0NzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9DZmlyc3QpICogKHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwYXJrc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9DdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0NmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwYXJrc19sb3dfc3RyZXNzID0gMiBUSEVOID9DZmlyc3QgKyA/Q3NlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/Q2ZpcnN0IC0gP0NzZWNvbmQpICogKHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBhcmtzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwYXJrc19sb3dfc3RyZXNzID0gMSBUSEVOID9DZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfbG93X3N0cmVzcyA9IDIgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfbG93X3N0cmVzcyA9IDMgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQgKyA/Q3RoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9DZmlyc3QgKyA/Q3NlY29uZCArID9DdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/Q2ZpcnN0IC0gP0NzZWNvbmQgLSA/Q3RoaXJkKSAqIChwYXJrc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwYXJrc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBwYXJrIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3BhcmtzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BhcmtzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcGFya3MuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGFya3MuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBwaGFybWFjaWVzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBoYXJtYWNpZXNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgcGhhcm1hY2llc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBoYXJtYWNpZXNfc2NvcmUgPSAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyA9IHBoYXJtYWNpZXNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CZmlyc3QgPSAwIFRIRU4gcGhhcm1hY2llc19sb3dfc3RyZXNzOjpGTE9BVCAvIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QpICogKHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwaGFybWFjaWVzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQpICogKHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQgLSA/QnRoaXJkKSAqIChwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwaGFybWFjaWVzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggcGhhcm1hY2llcyBkZXN0aW5hdGlvbiBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHJldGFpbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICByZXRhaWxfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHJldGFpbF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICByZXRhaWxfc2NvcmUgPSAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3MgPSByZXRhaWxfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JmaXJzdCA9IDAgVEhFTiByZXRhaWxfbG93X3N0cmVzczo6RkxPQVQgLyByZXRhaWxfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QpICogKHJldGFpbF9sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocmV0YWlsX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0J0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kKSAqIChyZXRhaWxfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocmV0YWlsX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHJldGFpbF9sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfbG93X3N0cmVzcyA9IDMgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZCArID9CdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQgLSA/QnRoaXJkKSAqIChyZXRhaWxfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocmV0YWlsX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIHJldGFpbCBkZXN0aW5hdGlvbiBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHNjaG9vbHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc2Nob29sc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBzY2hvb2xzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc2Nob29sc19zY29yZSA9IENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzY2hvb2xzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcyA9IHNjaG9vbHNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0NmaXJzdCA9IDAgVEhFTiBzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUIC8gc2Nob29sc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/Q3NlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9DZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0NmaXJzdCkgKiAoc2Nob29sc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc2Nob29sc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9DdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0NmaXJzdCArID9Dc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0NmaXJzdCAtID9Dc2Vjb25kKSAqIChzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNjaG9vbHNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19sb3dfc3RyZXNzID0gMyBUSEVOID9DZmlyc3QgKyA/Q3NlY29uZCArID9DdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0NmaXJzdCArID9Dc2Vjb25kICsgP0N0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9DZmlyc3QgLSA/Q3NlY29uZCAtID9DdGhpcmQpICogKHNjaG9vbHNfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc2Nob29sc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBzY2hvb2wgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBzb2NzZXJ2LCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQoNCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc29jaWFsX3NlcnZpY2VzX3Njb3JlID0gQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyA9IHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BZmlyc3QgPSAwIFRIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUIC8gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0KSAqIChzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzID0gMiBUSEVOID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kKSAqIChzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzID0gMSBUSEVOID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0FmaXJzdCArID9Bc2Vjb25kICsgP0F0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kIC0gP0F0aGlyZCkgKiAoc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBzb2NpYWwgc2VydmljZSBkZXN0aW5hdGlvbiBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBzdXBlcm1hcmtldHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc3VwZXJtYXJrZXRzX3Njb3JlID0gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA9IHN1cGVybWFya2V0c19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9EZmlyc3QgPSAwIFRIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M6OkZMT0FUIC8gc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0RzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9EZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RGZpcnN0KSAqIChzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RHRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0RmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19sb3dfc3RyZXNzID0gMiBUSEVOID9EZmlyc3QgKyA/RHNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9EZmlyc3QgKyA/RHNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0RmaXJzdCAtID9Ec2Vjb25kKSAqIChzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19sb3dfc3RyZXNzID0gMSBUSEVOID9EZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/RGZpcnN0ICsgP0RzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyA9IDMgVEhFTiA/RGZpcnN0ICsgP0RzZWNvbmQgKyA/RHRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0RmaXJzdCArID9Ec2Vjb25kICsgP0R0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0RmaXJzdCAtID9Ec2Vjb25kIC0gP0R0aGlyZCkgKiAoc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBzdXBlcm1hcmtldCBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCB0cmFpbHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIGxvdyBzdHJlc3MgYWNjZXNzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB0cmFpbHNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQocGF0aF9pZCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BhdGhzDQogICAgICAgICAgICBXSEVSRSAgIHBhdGhfbGVuZ3RoID4gP21pbl9wYXRoX2xlbmd0aA0KICAgICAgICAgICAgQU5EICAgICBiYm94X2xlbmd0aCA+ID9taW5fYmJveF9sZW5ndGgNCiAgICAgICAgICAgIEFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgbHMNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgbHMudGFyZ2V0X3JvYWQgPSBBTlkoZ2VuZXJhdGVkLnNhX3BhdGhzLnJvYWRfaWRzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBscy5iYXNlX3JvYWQgPSBBTlkoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLnJvYWRfaWRzKQ0KICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICB0cmFpbHNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKHBhdGhfaWQpDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wYXRocw0KICAgICAgICAgICAgV0hFUkUgICBwYXRoX2xlbmd0aCA+ID9taW5fcGF0aF9sZW5ndGgNCiAgICAgICAgICAgIEFORCAgICAgYmJveF9sZW5ndGggPiA/bWluX2Jib3hfbGVuZ3RoDQogICAgICAgICAgICBBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19oaWdoX3N0cmVzcyBocw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBocy50YXJnZXRfcm9hZCA9IEFOWShnZW5lcmF0ZWQuc2FfcGF0aHMucm9hZF9pZHMpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGhzLmJhc2Vfcm9hZCA9IEFOWShnZW5lcmF0ZWQuc2FfcG9wX2dyaWQucm9hZF9pZHMpDQogICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdHJhaWxzX3Njb3JlID0gIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2hpZ2hfc3RyZXNzID0gdHJhaWxzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9FZmlyc3QgPSAwIFRIRU4gdHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUIC8gdHJhaWxzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Fc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0VmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RWZpcnN0KSAqICh0cmFpbHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYWlsc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9FdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19sb3dfc3RyZXNzID0gMSBUSEVOID9FZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0VmaXJzdCArID9Fc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9FZmlyc3QgKyA/RXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9FZmlyc3QgLSA/RXNlY29uZCkgKiAodHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYWlsc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0VmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFpbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/RWZpcnN0ICsgP0VzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0VmaXJzdCArID9Fc2Vjb25kICsgP0V0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/RWZpcnN0ICsgP0VzZWNvbmQgKyA/RXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0VmaXJzdCAtID9Fc2Vjb25kIC0gP0V0aGlyZCkgKiAodHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYWlsc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgdHJhbnNpdCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB0cmFuc2l0X2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHRyYW5zaXRfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB0cmFuc2l0X3Njb3JlID0gICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhbnNpdF9oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3MgPSB0cmFuc2l0X2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9GZmlyc3QgPSAwIFRIRU4gdHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVCAvIHRyYW5zaXRfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0ZzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/RmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9GZmlyc3QpICogKHRyYW5zaXRfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYW5zaXRfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RnRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAxIFRIRU4gP0ZmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAyIFRIRU4gP0ZmaXJzdCArID9Gc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9GZmlyc3QgKyA/RnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9GZmlyc3QgLSA/RnNlY29uZCkgKiAodHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh0cmFuc2l0X2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAxIFRIRU4gP0ZmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAyIFRIRU4gP0ZmaXJzdCArID9Gc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfbG93X3N0cmVzcyA9IDMgVEhFTiA/RmZpcnN0ICsgP0ZzZWNvbmQgKyA/RnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9GZmlyc3QgKyA/RnNlY29uZCArID9GdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RmZpcnN0IC0gP0ZzZWNvbmQgLSA/RnRoaXJkKSAqICh0cmFuc2l0X2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYW5zaXRfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggcGFyayBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHVuaXZlcnNpdGllcywgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB1bml2ZXJzaXRpZXNfc2NvcmUgPSAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzID0gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FmaXJzdCA9IDAgVEhFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQgLyB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QpICogKHVuaXZlcnNpdGllc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQpICogKHVuaXZlcnNpdGllc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzID0gMiBUSEVOID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzID0gMyBUSEVOID9BZmlyc3QgKyA/QXNlY29uZCArID9BdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQgLSA/QXRoaXJkKSAqICh1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIHVuaXZlcnNpdHkgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOyAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNCk9uY2UgYWdhaW4sIG9uIHRoaXMgc3RlcCBJIGRvIG5vdCBpbmNsdWRlIHRoZSBTUUwgY29kZXMsIGhvd2V2ZXIgdGhleSBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYFJtZGAgZmlsZS4NCg0KIyMjIDExLiBDb21wdXRlIG92ZXJhbGwgYWNjZXNzDQoNCkR1cmluZyB0aGlzIHN0ZXAgdGhlIG92ZXJhbGwgYWNjZXNzIGlzIGNvbXB1dGVkIGZvciBlYWNoIHBvcHVsYXRpb24gZ3JpZCwgbWVhbmluZyB0aGF0IHdlIGNhbiBhbHJlYWR5IG9ic2VydmUgdGhlIEJOQSBzY29yZSBzcGF0aWFsIGJlaGF2aW9yIHdpdGhpbiBvdXIgc3R1ZHkgYXJlYS4gDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9DQp0b3RhbCA9IDEwMA0KcGVvcGxlID0gMTUNCm9wcG9ydHVuaXR5ID0gMjANCmNvcmVfc2VydmljZXMgPSAyMA0KcmV0YWlsID0gMTUNCnJlY3JlYXRpb24gPSAxNQ0KdHJhbnNpdCA9IDE1DQpgYGANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgb3ZlcmFsbF9zY29yZSA9ID90b3RhbCAqDQogICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgP3Blb3BsZSAqIENPQUxFU0NFKHBvcF9zY29yZSwwKQ0KICAgICAgICAgICAgICAgICsgP29wcG9ydHVuaXR5ICoNCiAgICAgICAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOICAgIENPQUxFU0NFKHNjaG9vbHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGNvbGxlZ2VzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRSh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1ICogQ09BTEVTQ0UoZW1wX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMzUgKiBDT0FMRVNDRShzY2hvb2xzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIENPQUxFU0NFKGNvbGxlZ2VzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMiAqIENPQUxFU0NFKHVuaXZlcnNpdGllc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4zNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgKyA/Y29yZV9zZXJ2aWNlcyAqDQogICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiAgICBDT0FMRVNDRShkb2N0b3JzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShkZW50aXN0c19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMiAqIENPQUxFU0NFKGRvY3RvcnNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xICogQ09BTEVTQ0UoZGVudGlzdHNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yICogQ09BTEVTQ0UoaG9zcGl0YWxzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIENPQUxFU0NFKHBoYXJtYWNpZXNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yNSAqIENPQUxFU0NFKHN1cGVybWFya2V0c19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjE1ICogQ09BTEVTQ0Uoc29jaWFsX3NlcnZpY2VzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4xDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4xDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMjUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4xNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICArID9yZXRhaWwgKiBDT0FMRVNDRShyZXRhaWxfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICArID9yZWNyZWF0aW9uICoNCiAgICAgICAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOICAgIENPQUxFU0NFKHBhcmtzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRSh0cmFpbHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40ICogQ09BTEVTQ0UocGFya3Nfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4zNSAqIENPQUxFU0NFKHRyYWlsc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjI1ICogQ09BTEVTQ0UoY29tbXVuaXR5X2NlbnRlcnNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjI1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgP3RyYW5zaXQgKiBDT0FMRVNDRSh0cmFuc2l0X3Njb3JlLDApDQogICAgICAgICAgICApIC8NCiAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICA/cGVvcGxlDQogICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzY2hvb2xzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShjb2xsZWdlc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UodW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFID9vcHBvcnR1bml0eQ0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGRvY3RvcnNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGRlbnRpc3RzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShob3NwaXRhbHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHN1cGVybWFya2V0c19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0Uoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UocmV0YWlsX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgRUxTRSA/cmV0YWlsDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UocGFya3NfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHRyYWlsc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgP3JlY3JlYXRpb24NCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0cmFuc2l0X2hpZ2hfc3RyZXNzLDApID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgP3RyYW5zaXQNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGIuZ2VvbWV0cnksZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5KQ0KICAgICAgICApOw0KICAgICAgICANClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCiMjIyAxMi4gQ29tcHV0ZSBvdmVyYWxsIHNjb3JlIGZvciB0aGUgd2hvbGUgc3R1ZHkgYXJlYQ0KDQpGb3IgdGhpcyBzdGVwIGEgbmV3IHRhYmxlIGlzIGdlbmVyYXRlZCBpbiB0aGUgZGF0YWJhc2UgYHNhX3Njb3JlX2lucHV0c2AgdG8gc3RvcmUgdGhlIHByZWxpbWluYXJ5IHJlc3VsdHMuIFRoZSBjb2RlIGNhbiBiZSBhY2Nlc3NlZCBvbiB0aGUgYFJtZGAgZmlsZS4gDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQoNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHM7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2F0ZWdvcnkgVEVYVCwNCiAgICBzY29yZV9uYW1lIFRFWFQsDQogICAgc2NvcmUgTlVNRVJJQygxNiw0KSwNCiAgICBub3RlcyBURVhULA0KICAgIGh1bWFuX2V4cGxhbmF0aW9uIFRFWFQsDQogICAgdXNlX3BvcCBCT09MRUFOLA0KICAgIHVzZV9lbXAgQk9PTEVBTiwNCiAgICB1c2VfazEyIEJPT0xFQU4sDQogICAgdXNlX3RlY2ggQk9PTEVBTiwNCiAgICB1c2VfdW5pdiBCT09MRUFOLA0KICAgIHVzZV9kb2N0b3IgQk9PTEVBTiwNCiAgICB1c2VfZGVudGlzdCBCT09MRUFOLA0KICAgIHVzZV9ob3NwaXRhbCBCT09MRUFOLA0KICAgIHVzZV9waGFybWFjeSBCT09MRUFOLA0KICAgIHVzZV9yZXRhaWwgQk9PTEVBTiwNCiAgICB1c2VfZ3JvY2VyeSBCT09MRUFOLA0KICAgIHVzZV9zb2NpYWxfc3ZjcyBCT09MRUFOLA0KICAgIHVzZV9wYXJrcyBCT09MRUFOLA0KICAgIHVzZV90cmFpbHMgQk9PTEVBTiwNCiAgICB1c2VfY29tbV9jdHJzIEJPT0xFQU4sDQogICAgdXNlX3RyYW5zaXQgQk9PTEVBTg0KKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdGVtcG9yYXJ5IHRhYmxlIG9mIHRvdGFsIHBvcHVsYXRpb24NCi0tIGZvciB3ZWlnaHRpbmcgcHVycG9zZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9wb3A7DQpDUkVBVEUgVEVNUCBUQUJMRSB0bXBfcG9wICgNCiAgICBvdmVyYWxsIElOVEVHRVIsDQogICAgazEyIElOVEVHRVIsDQogICAgdGVjaCBJTlRFR0VSLA0KICAgIHVuaXYgSU5URUdFUiwNCiAgICBkb2N0b3IgSU5URUdFUiwNCiAgICBkZW50aXN0IElOVEVHRVIsDQogICAgaG9zcGl0YWwgSU5URUdFUiwNCiAgICBwaGFybWFjeSBJTlRFR0VSLA0KICAgIHJldGFpbCBJTlRFR0VSLA0KICAgIGdyb2NlcnkgSU5URUdFUiwNCiAgICBzb2NpYWxfc3ZjcyBJTlRFR0VSLA0KICAgIHBhcmtzIElOVEVHRVIsDQogICAgdHJhaWxzIElOVEVHRVIsDQogICAgY29tbV9jdHJzIElOVEVHRVIsDQogICAgdHJhbnNpdCBJTlRFR0VSDQopOw0KDQpJTlNFUlQgSU5UTyB0bXBfcG9wICgNCiAgICBvdmVyYWxsLCBrMTIsIHRlY2gsIHVuaXYsIGRvY3RvciwgZGVudGlzdCwgaG9zcGl0YWwsIHBoYXJtYWN5LA0KICAgIHJldGFpbCwgZ3JvY2VyeSwgc29jaWFsX3N2Y3MsIHBhcmtzLCB0cmFpbHMsIGNvbW1fY3RycywgdHJhbnNpdA0KKQ0KU0VMRUNUICBTVU0ocGFydGlhbF9wKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShzY2hvb2xzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShjb2xsZWdlc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UodW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShkb2N0b3JzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShkZW50aXN0c19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShyZXRhaWxfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIENPQUxFU0NFKHN1cGVybWFya2V0c19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0Uoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShwYXJrc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UodHJhaWxzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UodHJhbnNpdF9oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCkNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBwb3B1bGF0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBtZWRpYW4gcG9wIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgYWNjZXNzIHRvIHBvcHVsYXRpb24nLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBwb3B1bGF0aW9uIGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgYSByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2VzcyBhYm92ZSB0aGlzIG51bWJlciwNCiAgICAgICAgICAgIGhhbGYgaGF2ZSBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBwb3AgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUGVvcGxlJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBhY2Nlc3MgdG8gcG9wdWxhdGlvbicsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBwb3B1bGF0aW9uIGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgNzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgcG9wIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgYWNjZXNzIHRvIHBvcHVsYXRpb24nLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBwb3B1bGF0aW9uIGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgMzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBhdmcgcG9wIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBwb3B1bGF0aW9uJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gcG9wdWxhdGlvbiBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICB0aGlzIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3BvcA0KKQ0KU0VMRUNUICAnUGVvcGxlJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHBvcHVsYXRpb24nLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3Aub3ZlcmFsbCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogcG9wX3Njb3JlIC8gdG1wX3BvcC5vdmVyYWxsIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHBvcHVsYXRpb24gc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBwb3B1bGF0aW9uIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gZW1wbG95bWVudA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gbWVkaWFuIGpvYnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGFjY2VzcyB0byBlbXBsb3ltZW50JywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBlbXBfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBlbXBfbG93X3N0cmVzczo6RkxPQVQvZW1wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBlbXBsb3ltZW50IGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gZW1wbG95bWVudCBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGEgcmF0aW8gb2YgbG93IHN0cmVzcyB0byBoaWdoIHN0cmVzcyBhY2Nlc3MgYWJvdmUgdGhpcyBudW1iZXIsDQogICAgICAgICAgICBoYWxmIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgam9icyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgYWNjZXNzIHRvIGVtcGxveW1lbnQnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGVtcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGVtcF9sb3dfc3RyZXNzOjpGTE9BVC9lbXBfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGVtcGxveW1lbnQgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBlbXBsb3ltZW50IGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgNzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgam9icyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgYWNjZXNzIHRvIGVtcGxveW1lbnQnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGVtcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGVtcF9sb3dfc3RyZXNzOjpGTE9BVC9lbXBfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGVtcGxveW1lbnQgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBlbXBsb3ltZW50IGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgMzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBhdmcgam9icyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBlbXBsb3ltZW50JywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShlbXBfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShlbXBfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKGVtcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBlbXBsb3ltZW50IGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gZW1wbG95bWVudCBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICB0aGlzIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX2VtcA0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gam9icycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5vdmVyYWxsID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBlbXBfc2NvcmUgLyB0bXBfcG9wLm92ZXJhbGwgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgZW1wbG95bWVudCBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGVtcGxveW1lbnQgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gc2Nob29scw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBzY2hvb2wgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBzY2hvb2xzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShzY2hvb2xzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oc2Nob29sc19sb3dfc3RyZXNzKSAvIFNVTShzY2hvb2xzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBzY2hvb2xzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgc2Nob29scy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gc2Nob29scyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2Ygc2Nob29sIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHNjaG9vbHNfbG93X3N0cmVzczo6RkxPQVQvc2Nob29sc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc2Nob29scyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzY2hvb2xzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHNjaG9vbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHNjaG9vbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUL3NjaG9vbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzY2hvb2xzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzY2hvb2xzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgc2Nob29scyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2Ygc2Nob29sIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHNjaG9vbHNfbG93X3N0cmVzczo6RkxPQVQvc2Nob29sc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc2Nob29scyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHNjaG9vbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX2sxMg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gSzEyIHNjaG9vbHMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AuazEyID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBzY2hvb2xzX3Njb3JlIC8gdG1wX3BvcC5rMTIgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgSzEyIHNjaG9vbHMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBLMTIgc2Nob29scyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzY2hvb2wgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2Nob29sIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2Ygc2Nob29scyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNjaG9vbCBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gc2Nob29sIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNjaG9vbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc2Nob29sIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzY2hvb2wgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjaG9vbCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzY2hvb2xzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHNjaG9vbCBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2Ygc2Nob29scyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2Nob29sIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY2hvb2wgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc2Nob29scw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzY2hvb2wgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdGVjaG5pY2FsL3ZvY2F0aW9uYWwgY29sbGVnZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgdGVjaG5pY2FsL3ZvY2F0aW9uYWwgY29sbGVnZSBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oY29sbGVnZXNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShjb2xsZWdlc19sb3dfc3RyZXNzKSAvIFNVTShjb2xsZWdlc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBjb2xsZWdlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUL2NvbGxlZ2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgY29sbGVnZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29sbGVnZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb2xsZWdlc19sb3dfc3RyZXNzOjpGTE9BVC9jb2xsZWdlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBjb2xsZWdlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUL2NvbGxlZ2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfdGVjaA0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnRlY2ggPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIGNvbGxlZ2VzX3Njb3JlIC8gdG1wX3BvcC50ZWNoIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBjb2xsZWdlIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIGNvbGxlZ2UgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIGNvbGxlZ2VzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29sbGVnZSBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbGxlZ2UgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29sbGVnZSBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbGxlZ2UgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29sbGVnZSBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbGxlZ2UgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSB1bml2ZXJzaXRpZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgdW5pdmVyc2l0eSBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHVuaXZlcnNpdGllcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0odW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0odW5pdmVyc2l0aWVzX2xvd19zdHJlc3MpIC8gU1VNKHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgdW5pdmVyc2l0aWVzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiB1bml2ZXJzaXRpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHVuaXZlcnNpdHkgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQvdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB1bml2ZXJzaXRpZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgdW5pdmVyc2l0aWVzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiB1bml2ZXJzaXR5IGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdW5pdmVyc2l0aWVzX2xvd19zdHJlc3M6OkZMT0FUL3VuaXZlcnNpdGllc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB1bml2ZXJzaXRpZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSB1bml2ZXJzaXRpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHVuaXZlcnNpdHkgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQvdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHVuaXZlcnNpdGllcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfdW5pdg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gdW5pdmVyc2l0aWVzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnVuaXYgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHVuaXZlcnNpdGllc19zY29yZSAvIHRtcF9wb3AudW5pdiBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSB1bml2ZXJzaXRpZXMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyB1bml2ZXJzaXRpZXMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdW5pdmVyc2l0eSBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSB1bml2ZXJzaXR5IGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB1bml2ZXJzaXR5IHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ01lZGlhbiB1bml2ZXJzaXR5IHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHVuaXZlcnNpdGllcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCB1bml2ZXJzaXR5IGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgdW5pdmVyc2l0eSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdW5pdmVyc2l0eSBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgdW5pdmVyc2l0eSBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byB1bml2ZXJzaXRpZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggdW5pdmVyc2l0eSBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiB1bml2ZXJzaXRpZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHVuaXZlcnNpdHkgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHVuaXZlcnNpdHkgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHVuaXZlcnNpdHkgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdW5pdmVyc2l0aWVzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHVuaXZlcnNpdHkgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICB1bml2ZXJzaXRpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB1bml2ZXJzaXR5IGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGRvY3RvcnMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgZG9jdG9ycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gZG9jdG9ycycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oZG9jdG9yc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKGRvY3RvcnNfbG93X3N0cmVzcykgLyBTVU0oZG9jdG9yc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgZG9jdG9ycyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IGRvY3RvcnMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIGRvY3RvcnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgZG9jdG9ycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUL2RvY3RvcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRvY3RvcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBkb2N0b3JzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgZG9jdG9ycyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBkb2N0b3JzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGRvY3RvcnMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZG9jdG9yc19sb3dfc3RyZXNzOjpGTE9BVC9kb2N0b3JzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkb2N0b3JzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZG9jdG9ycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgZG9jdG9ycyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIGRvY3RvcnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgZG9jdG9ycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUL2RvY3RvcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRvY3RvcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBkb2N0b3JzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBkb2N0b3JzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9kb2N0b3INCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gZG9jdG9ycycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5kb2N0b3IgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIGRvY3RvcnNfc2NvcmUgLyB0bXBfcG9wLmRvY3RvciBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBkb2N0b3JzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgZG9jdG9ycyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkb2N0b3JzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2UgZG9jdG9ycyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIGRvY3RvcnMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgZG9jdG9ycyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RvY3RvcnMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkb2N0b3JzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIGRvY3RvcnMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gZG9jdG9ycw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBkb2N0b3JzIG9mZmljZSBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgZG9jdG9ycyBvZmZpY2UgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZG9jdG9ycyBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBkb2N0b3JzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRvY3RvcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZG9jdG9ycyBvZmZpY2UgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIGRvY3RvcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRvY3RvcnMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZG9jdG9ycyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBkb2N0b3JzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRvY3RvcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZG9jdG9ycyBvZmZpY2UgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIGRvY3RvcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRvY3RvcnMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gZGVudGlzdHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgZGVudGlzdHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRlbnRpc3RzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShkZW50aXN0c19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKGRlbnRpc3RzX2xvd19zdHJlc3MpIC8gU1VNKGRlbnRpc3RzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBkZW50aXN0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IGRlbnRpc3RzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBkZW50aXN0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBkZW50aXN0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQvZGVudGlzdHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZGVudGlzdHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBkZW50aXN0cyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBkZW50aXN0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBkZW50aXN0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQvZGVudGlzdHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZGVudGlzdHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGRlbnRpc3RzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgZGVudGlzdHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgZGVudGlzdHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUL2RlbnRpc3RzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkZW50aXN0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBkZW50aXN0cyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfZGVudGlzdA0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBkZW50aXN0cycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5kZW50aXN0ID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBkZW50aXN0c19zY29yZSAvIHRtcF9wb3AuZGVudGlzdCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBkZW50aXN0cyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGRlbnRpc3RzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGRlbnRpc3RzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2UgZGVudGlzdHMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBkZW50aXN0cyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkZW50aXN0cyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBkZW50aXN0cyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBkZW50aXN0cw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBkZW50aXN0cyBvZmZpY2UgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgZGVudGlzdHMgb2ZmaWNlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZGVudGlzdHMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgZGVudGlzdHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gZGVudGlzdHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZGVudGlzdHMgb2ZmaWNlIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRlbnRpc3RzIG9mZmljZSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGRlbnRpc3RzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIGRlbnRpc3RzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRlbnRpc3RzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGRlbnRpc3RzIG9mZmljZSBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBkZW50aXN0cyBvZmZpY2UgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBob3NwaXRhbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgaG9zcGl0YWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKGhvc3BpdGFsc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKGhvc3BpdGFsc19sb3dfc3RyZXNzKSAvIFNVTShob3NwaXRhbHNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IGhvc3BpdGFscy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gaG9zcGl0YWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGhvc3BpdGFsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVC9ob3NwaXRhbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGhvc3BpdGFscyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBob3NwaXRhbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgaG9zcGl0YWxzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUL2hvc3BpdGFsc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBob3NwaXRhbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBob3NwaXRhbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgaG9zcGl0YWxzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUL2hvc3BpdGFsc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBob3NwaXRhbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX2hvc3BpdGFsDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIGhvc3BpdGFscycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5ob3NwaXRhbCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogaG9zcGl0YWxzX3Njb3JlIC8gdG1wX3BvcC5ob3NwaXRhbCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBob3NwaXRhbCBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGhvc3BpdGFsIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGhvc3BpdGFscyBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIGhvc3BpdGFscyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gaG9zcGl0YWxzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIGhvc3BpdGFscyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggaG9zcGl0YWwgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBob3NwaXRhbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gaG9zcGl0YWxzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIGhvc3BpdGFscyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggaG9zcGl0YWwgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBob3NwaXRhbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gaG9zcGl0YWxzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIGhvc3BpdGFscyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggaG9zcGl0YWwgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBob3NwaXRhbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gcGhhcm1hY2llcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBwaGFybWFjaWVzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBwaGFybWFjaWVzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocGhhcm1hY2llc19sb3dfc3RyZXNzKSAvIFNVTShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBwaGFybWFjaWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgcGhhcm1hY2llcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gcGhhcm1hY2llcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBwaGFybWFjaWVzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQvcGhhcm1hY2llc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBwaGFybWFjaWVzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHBoYXJtYWNpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUL3BoYXJtYWNpZXNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwaGFybWFjaWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBwaGFybWFjaWVzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgcGhhcm1hY2llcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBwaGFybWFjaWVzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQvcGhhcm1hY2llc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHBoYXJtYWNpZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3BoYXJtYWN5DQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHBoYXJtYWNpZXMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AucGhhcm1hY3kgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHBoYXJtYWNpZXNfc2NvcmUgLyB0bXBfcG9wLnBoYXJtYWN5IEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHBoYXJtYWNpZXMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBwaGFybWFjaWVzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBoYXJtYWNpZXMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBwaGFybWFjaWVzIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgcGhhcm1hY2llcyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBoYXJtYWNpZXMgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gcGhhcm1hY2llcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBwaGFybWFjaWVzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHBoYXJtYWN5IGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBwaGFybWFjeSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwaGFybWFjaWVzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHBoYXJtYWNpZXMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGhhcm1hY2llcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBwaGFybWFjeSBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcGhhcm1hY2llcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcGhhcm1hY3kgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcGhhcm1hY2llcyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBwaGFybWFjaWVzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHBoYXJtYWNpZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcGhhcm1hY3kgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHBoYXJtYWN5IGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHJldGFpbA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSByZXRhaWwgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gcmV0YWlsJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShyZXRhaWxfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShyZXRhaWxfbG93X3N0cmVzcykgLyBTVU0ocmV0YWlsX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiByZXRhaWwgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSByZXRhaWwuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHJldGFpbCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHJldGFpbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHJldGFpbF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHJldGFpbF9sb3dfc3RyZXNzOjpGTE9BVC9yZXRhaWxfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHJldGFpbCB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSByZXRhaWwgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiByZXRhaWwgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSByZXRhaWxfbG93X3N0cmVzczo6RkxPQVQvcmV0YWlsX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiByZXRhaWwgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byByZXRhaWwgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHJldGFpbCB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHJldGFpbCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHJldGFpbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHJldGFpbF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHJldGFpbF9sb3dfc3RyZXNzOjpGTE9BVC9yZXRhaWxfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcmV0YWlsIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9yZXRhaWwNCikNClNFTEVDVCAgJ1JldGFpbCcsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byByZXRhaWwnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AucmV0YWlsID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiByZXRhaWxfc2NvcmUgLyB0bXBfcG9wLnJldGFpbCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSByZXRhaWwgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyByZXRhaWwgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcmV0YWlsIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnQXZlcmFnZSByZXRhaWwgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcmV0YWlsIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JldGFpbCcsDQogICAgICAgICdNZWRpYW4gcmV0YWlsIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHJldGFpbA0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCByZXRhaWwgY2x1c3RlciBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHJldGFpbCBjbHVzdGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHJldGFpbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3JldGFpbA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmdlb21fcG9seSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSByZXRhaWwgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSByZXRhaWwgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcmV0YWlsDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHJldGFpbCBjbHVzdGVyIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHJldGFpbCBjbHVzdGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcmV0YWlsIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwuZ2VvbV9wb2x5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHJldGFpbCBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHJldGFpbCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byByZXRhaWwNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcmV0YWlsIGNsdXN0ZXIgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSByZXRhaWwgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gc3VwZXJtYXJrZXRzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHN1cGVybWFya2V0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gc3VwZXJtYXJrZXRzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShzdXBlcm1hcmtldHNfbG93X3N0cmVzcykgLyBTVU0oc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSBzdXBlcm1hcmtldHMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHN1cGVybWFya2V0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQvc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzdXBlcm1hcmtldHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgc3VwZXJtYXJrZXRzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHN1cGVybWFya2V0c19sb3dfc3RyZXNzOjpGTE9BVC9zdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc3VwZXJtYXJrZXRzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgc3VwZXJtYXJrZXRzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHN1cGVybWFya2V0c19sb3dfc3RyZXNzOjpGTE9BVC9zdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc3VwZXJtYXJrZXRzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9ncm9jZXJ5DQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIGdyb2Nlcnkgc3RvcmVzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLmdyb2NlcnkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHN1cGVybWFya2V0c19zY29yZSAvIHRtcF9wb3AuZ3JvY2VyeSBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBncm9jZXJ5IHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgZ3JvY2VyeSBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzdXBlcm1hcmtldHMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzdXBlcm1hcmtldHMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHN1cGVybWFya2V0cyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzdXBlcm1hcmtldHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc3VwZXJtYXJrZXRzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHN1cGVybWFya2V0IGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHN1cGVybWFya2V0cyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2Ygc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgc3VwZXJtYXJrZXRzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzdXBlcm1hcmtldHMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc3VwZXJtYXJrZXRzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHN1cGVybWFya2V0cw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzdXBlcm1hcmtldCBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHN1cGVybWFya2V0cyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHN1cGVybWFya2V0cyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc3VwZXJtYXJrZXRzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHN1cGVybWFya2V0cyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzdXBlcm1hcmtldHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc3VwZXJtYXJrZXQgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2Ygc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBzdXBlcm1hcmtldHMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHNvY2lhbF9zZXJ2aWNlcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBzb2NpYWxfc2VydmljZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNvY2lhbCBzZXJ2aWNlcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MpIC8gU1VNKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgc29jaWFsIHNlcnZpY2VzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBzb2NpYWxfc2VydmljZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0Ugc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUL3NvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc29jaWFsIHNlcnZpY2VzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHNvY2lhbF9zZXJ2aWNlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQvc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHNvY2lhbCBzZXJ2aWNlcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHNvY2lhbF9zZXJ2aWNlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQvc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHNvY2lhbCBzZXJ2aWNlcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2Vfc29jaWFsX3N2Y3MNCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gc29jaWFsIHNlcnZpY2VzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnNvY2lhbF9zdmNzID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBzb2NpYWxfc2VydmljZXNfc2NvcmUgLyB0bXBfcG9wLnNvY2lhbF9zdmNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHNvY2lhbCBzZXJ2aWNlcyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIHNvY2lhbCBzZXJ2aWNlcyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzb2NpYWxfc2VydmljZXMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzb2NpYWxfc2VydmljZXMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBzb2NpYWxfc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNvY2lhbF9zZXJ2aWNlcyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzb2NpYWxfc2VydmljZXMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc29jaWFsIHNlcnZpY2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHNvY2lhbCBzZXJ2aWNlIGxvY2F0aW9uIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHNvY2lhbCBzZXJ2aWNlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2Ygc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgc29jaWFsX3NlcnZpY2VzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzb2NpYWxfc2VydmljZXMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc29jaWFsX3NlcnZpY2VzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNvY2lhbCBzZXJ2aWNlcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzb2NpYWwgc2VydmljZSBsb2NhdGlvbiBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHNvY2lhbCBzZXJ2aWNlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHNvY2lhbF9zZXJ2aWNlcyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc29jaWFsX3NlcnZpY2VzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNvY2lhbF9zZXJ2aWNlcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzb2NpYWwgc2VydmljZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc29jaWFsIHNlcnZpY2UgbG9jYXRpb24gZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2Ygc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBzb2NpYWxfc2VydmljZXMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHBhcmtzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHBhcmtzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBwYXJrcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocGFya3NfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwYXJrc19sb3dfc3RyZXNzKSAvIFNVTShwYXJrc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgcGFya3MgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSBwYXJrcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gcGFya3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgcGFya3MgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwYXJrc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUL3BhcmtzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBhcmtzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcGFya3Mgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgcGFya3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgcGFya3MgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwYXJrc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUL3BhcmtzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBhcmtzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBwYXJrcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHBhcmtzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHBhcmtzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGFya3NfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwYXJrc19sb3dfc3RyZXNzOjpGTE9BVC9wYXJrc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGFya3MgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcGFya3Mgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3BhcmtzDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHBhcmtzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnBhcmtzID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBwYXJrc19zY29yZSAvIHRtcF9wb3AucGFya3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgcGFya3Mgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBwYXJrcyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwYXJrcyBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdBdmVyYWdlIHBhcmtzIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBwYXJrcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcGFya3MgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdNZWRpYW4gcGFya3MgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGFya3MNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcGFya3MgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcGFya3MgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGFya3MuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwYXJrcyBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBwYXJrcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBwYXJrcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBwYXJrcyBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBwYXJrcyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BhcmtzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBhcmtzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHBhcmtzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHBhcmtzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHBhcmtzIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHBhcmtzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdHJhaWxzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHRyYWlscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdHJhaWxzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTSh0cmFpbHNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTSh0cmFpbHNfbG93X3N0cmVzcykgLyBTVU0odHJhaWxzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiB0cmFpbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSB0cmFpbHMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHRyYWlscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiB0cmFpbHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFpbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFpbHNfbG93X3N0cmVzczo6RkxPQVQvdHJhaWxzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFpbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFpbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0cmFpbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgdHJhaWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRyYWlscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHRyYWlsc19sb3dfc3RyZXNzOjpGTE9BVC90cmFpbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhaWxzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgdHJhaWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRyYWlscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHRyYWlsc19sb3dfc3RyZXNzOjpGTE9BVC90cmFpbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhaWxzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV90cmFpbHMNCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gdHJhaWxzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnRyYWlscyA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogdHJhaWxzX3Njb3JlIC8gdG1wX3BvcC50cmFpbHMgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgdHJhaWxzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgdHJhaWxzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBjb21tdW5pdHlfY2VudGVycw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBjb21tdW5pdHlfY2VudGVycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gY29tbXVuaXR5IGNlbnRlcnMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcykgLyBTVU0oY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgY29tbXVuaXR5IGNlbnRlcnMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVC9jb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGNvbW11bml0eSBjZW50ZXJzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVC9jb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgY29tbXVuaXR5IGNlbnRlcnMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQvY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGNvbW11bml0eSBjZW50ZXJzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9jb21tX2N0cnMNCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gY29tbXVuaXR5IGNlbnRlcnMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AuY29tbV9jdHJzID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBjb21tdW5pdHlfY2VudGVyc19zY29yZSAvIHRtcF9wb3AuY29tbV9jdHJzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIGNvbW11bml0eSBjZW50ZXJzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgY29tbXVuaXR5IGNlbnRlcnMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29tbXVuaXR5IGNlbnRlcnMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBjb21tdW5pdHkgY2VudGVycyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgY29tbXVuaXR5IGNlbnRlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGNvbW11bml0eSBjZW50ZXJzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnTWVkaWFuIGNvbW11bml0eSBjZW50ZXJzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGNvbW11bml0eSBjZW50ZXJzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbW11bml0eSBjZW50ZXJzIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGNvbW11bml0eSBjZW50ZXJzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29tbXVuaXR5IGNlbnRlcnMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgY29tbXVuaXR5IGNlbnRlcnMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gY29tbXVuaXR5IGNlbnRlcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggY29tbXVuaXR5IGNlbnRlcnMgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgY29tbXVuaXR5IGNlbnRlcnMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBjb21tdW5pdHkgY2VudGVycyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBjb21tdW5pdHkgY2VudGVycyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBjb21tdW5pdHkgY2VudGVycw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBjb21tdW5pdHkgY2VudGVycyBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBjb21tdW5pdHkgY2VudGVycyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHRyYW5zaXQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgdHJhbnNpdCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdHJhbnNpdCcsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0odHJhbnNpdF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHRyYW5zaXRfbG93X3N0cmVzcykgLyBTVU0odHJhbnNpdF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgdHJhbnNpdCBzdGF0aW9ucyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IHRyYW5zaXQgc3RhdGlvbnMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHRyYW5zaXQgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgdHJhbnNpdCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFuc2l0X2xvd19zdHJlc3M6OkZMT0FUL3RyYW5zaXRfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYW5zaXQgc3RhdGlvbnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhbnNpdCBzdGF0aW9ucyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSB0cmFuc2l0IGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1RyYW5zaXQnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRyYW5zaXQgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFuc2l0X2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVC90cmFuc2l0X2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdHJhbnNpdCBzdGF0aW9ucyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhbnNpdCBzdGF0aW9ucyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHRyYW5zaXQgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgdHJhbnNpdCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFuc2l0X2xvd19zdHJlc3M6OkZMT0FUL3RyYW5zaXRfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYW5zaXQgc3RhdGlvbnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0cmFuc2l0IHN0YXRpb25zIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV90cmFuc2l0DQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHRyYW5zaXQnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AudHJhbnNpdCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogdHJhbnNpdF9zY29yZSAvIHRtcF9wb3AudHJhbnNpdCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSB0cmFuc2l0IHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgdHJhbnNpdCBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB0cmFuc2l0IHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJ0F2ZXJhZ2UgdHJhbnNpdCBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgdHJhbnNpdCBzdGF0aW9ucyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB0cmFuc2l0IHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1RyYW5zaXQnLA0KICAgICAgICAnTWVkaWFuIHRyYW5zaXQgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdHJhbnNpdCBzdGF0aW9ucw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCB0cmFuc2l0IHN0YXRpb25zIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB0cmFuc2l0IHN0YXRpb24gZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Lmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdHJhbnNpdCBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSB0cmFuc2l0IHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRyYW5zaXQgc3RhdGlvbnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggdHJhbnNpdCBzdGF0aW9ucyBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgdHJhbnNpdCBzdGF0aW9ucyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgdHJhbnNpdCBzdGF0aW9uIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHRyYW5zaXQgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgdHJhbnNpdCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byB0cmFuc2l0IHN0YXRpb25zDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHRyYW5zaXQgc3RhdGlvbnMgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRyYW5zaXQgc3RhdGlvbiBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHM7DQpgYGANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRSwgb3V0cHV0LnZhciA9ICJibmFfc2NvcmUifQ0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXM7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBzY29yZV9pZCBURVhULA0KICAgIHNjb3JlX29yaWdpbmFsIE5VTUVSSUMoMTYsNCksDQogICAgc2NvcmVfbm9ybWFsaXplZCBOVU1FUklDKDE2LDQpLA0KICAgIGh1bWFuX2V4cGxhbmF0aW9uIFRFWFQNCik7DQoNCi0tIHBvcHVsYXRpb24NCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncGVvcGxlJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9wb3A7DQoNCi0tIGVtcGxveW1lbnQNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnb3Bwb3J0dW5pdHlfZW1wbG95bWVudCcsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfZW1wOw0KDQotLSBrMTIgZWR1Y2F0aW9uDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5X2sxMl9lZHVjYXRpb24nLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2sxMjsNCg0KLS0gdGVjaCBzY2hvb2wNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnb3Bwb3J0dW5pdHlfdGVjaG5pY2FsX3ZvY2F0aW9uYWxfY29sbGVnZScsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfdGVjaDsNCg0KLS0gaGlnaGVyIGVkDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5X2hpZ2hlcl9lZHVjYXRpb24nLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3VuaXY7DQoNCi0tIG9wcG9ydHVuaXR5DQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5JywNCiAgICAgICAgKA0KICAgICAgICAgICAgMC4zNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnb3Bwb3J0dW5pdHlfZW1wbG95bWVudCcpDQogICAgICAgICAgICArIDAuMzUgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5X2sxMl9lZHVjYXRpb24nKQ0KICAgICAgICAgICAgKyAwLjEgKiAoc2VsZWN0IHNjb3JlX29yaWdpbmFsIGZyb20gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIHdoZXJlIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5X3RlY2huaWNhbF92b2NhdGlvbmFsX2NvbGxlZ2UnKQ0KICAgICAgICAgICAgKyAwLjIgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5X2hpZ2hlcl9lZHVjYXRpb24nKQ0KICAgICAgICApIC8NCiAgICAgICAgKA0KICAgICAgICAgICAgMC4zNQ0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc2Nob29sc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gMC4zNQ0KICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgY29sbGVnZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgKSwNCiAgICAgICAgTlVMTDsNCg0KLS0gZG9jdG9ycw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzX2RvY3RvcnMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2RvY3RvcjsNCg0KLS0gZGVudGlzdHMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnY29yZV9zZXJ2aWNlc19kZW50aXN0cycsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfZGVudGlzdDsNCg0KLS0gaG9zcGl0YWxzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ2NvcmVfc2VydmljZXNfaG9zcGl0YWxzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9ob3NwaXRhbDsNCg0KLS0gcGhhcm1hY2llcw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzX3BoYXJtYWNpZXMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3BoYXJtYWN5Ow0KDQotLSBncm9jZXJ5DQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ2NvcmVfc2VydmljZXNfZ3JvY2VyeScsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfZ3JvY2VyeTsNCg0KLS0gc29jaWFsIHNlcnZpY2VzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ2NvcmVfc2VydmljZXNfc29jaWFsX3NlcnZpY2VzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9zb2NpYWxfc3ZjczsNCg0KLS0gY29yZSBzZXJ2aWNlcw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzJywNCiAgICAgICAgQ0FTRQ0KICAgICAgICBXSEVOIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQogICAgICAgICAgICBXSEVSRSAgIGRvY3RvcnNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgT1IgICAgICBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgIE9SICAgICAgc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICApDQogICAgICAgICAgICBUSEVOICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMiAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19kb2N0b3JzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdjb3JlX3NlcnZpY2VzX2RlbnRpc3RzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdjb3JlX3NlcnZpY2VzX2hvc3BpdGFscycpDQogICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19waGFybWFjaWVzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19ncm9jZXJ5JykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19zb2NpYWxfc2VydmljZXMnKQ0KICAgICAgICAgICAgICAgICAgICApIC8NCiAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGRvY3RvcnNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgZGVudGlzdHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgaG9zcGl0YWxzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjI1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMTUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICBFTFNFIE5VTEwNCiAgICAgICAgRU5ELA0KICAgICAgICBOVUxMOw0KDQotLSByZXRhaWwNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncmV0YWlsJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9yZXRhaWw7DQoNCi0tIHBhcmtzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3JlY3JlYXRpb25fcGFya3MnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3BhcmtzOw0KDQotLSB0cmFpbHMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncmVjcmVhdGlvbl90cmFpbHMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3RyYWlsczsNCg0KLS0gY29tbXVuaXR5X2NlbnRlcnMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncmVjcmVhdGlvbl9jb21tdW5pdHlfY2VudGVycycsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfY29tbV9jdHJzOw0KDQotLSByZWNyZWF0aW9uDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3JlY3JlYXRpb24nLA0KICAgICAgICBDQVNFDQogICAgICAgIFdIRU4gRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCiAgICAgICAgICAgIFdIRVJFICAgcGFya3NfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIHRyYWlsc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgIE9SICAgICAgY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICkNCiAgICAgICAgICAgIFRIRU4gICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgMC40ICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdyZWNyZWF0aW9uX3BhcmtzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4zNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAncmVjcmVhdGlvbl90cmFpbHMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjI1ICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdyZWNyZWF0aW9uX2NvbW11bml0eV9jZW50ZXJzJykNCiAgICAgICAgICAgICAgICAgICAgKSAvDQogICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBwYXJrc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSB0cmFpbHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjI1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgRUxTRSBOVUxMDQogICAgICAgIEVORCwNCiAgICAgICAgTlVMTDsNCg0KLS0gdHJhbnNpdA0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICd0cmFuc2l0JywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV90cmFuc2l0Ow0KDQotLSBjYWxjdWxhdGUgb3ZlcmFsbCBuZWlnaGJvcmhvb2Qgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnb3ZlcmFsbF9zY29yZScsDQogICAgICAgICgNCiAgICAgICAgICAgID9wZW9wbGUgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ3Blb3BsZScpLDApDQogICAgICAgICAgICArID9vcHBvcnR1bml0eSAqIENPQUxFU0NFKChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnb3Bwb3J0dW5pdHknKSwwKQ0KICAgICAgICAgICAgKyA/Y29yZV9zZXJ2aWNlcyAqIENPQUxFU0NFKChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlcycpLDApDQogICAgICAgICAgICArID9yZXRhaWwgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ3JldGFpbCcpLDApDQogICAgICAgICAgICArID9yZWNyZWF0aW9uICogQ09BTEVTQ0UoKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdyZWNyZWF0aW9uJyksMCkNCiAgICAgICAgICAgICsgP3RyYW5zaXQgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ3RyYW5zaXQnKSwwKQ0KICAgICAgICApIC8NCiAgICAgICAgKA0KICAgICAgICAgICAgP3Blb3BsZSArID9vcHBvcnR1bml0eQ0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgZG9jdG9yc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP2NvcmVfc2VydmljZXMNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgZGVudGlzdHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGhvc3BpdGFsc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP2NvcmVfc2VydmljZXMNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgcGhhcm1hY2llc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP2NvcmVfc2VydmljZXMNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/Y29yZV9zZXJ2aWNlcw0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSByZXRhaWxfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9yZXRhaWwNCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHBhcmtzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/cmVjcmVhdGlvbg0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSB0cmFpbHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9yZWNyZWF0aW9uDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/cmVjcmVhdGlvbg0KICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgdHJhbnNpdF9oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP3RyYW5zaXQNCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgKSwNCiAgICAgICAgTlVMTDsNCg0KLS0gbm9ybWFsaXplDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3Jlcw0KU0VUICAgICBzY29yZV9ub3JtYWxpemVkID0gc2NvcmVfb3JpZ2luYWwgKiA/dG90YWw7DQoNCi0tIHBvcHVsYXRpb24NCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncG9wdWxhdGlvbl90b3RhbCcsDQogICAgICAgICgNCiAgICAgICAgICAgIFNFTEVDVCBTVU0ocGFydGlhbF9wKSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhiLmdlb21ldHJ5LGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICAnVG90YWwgcG9wdWxhdGlvbiBvZiBib3VuZGFyeSc7DQoNCg0KLS0gaGlnaCBhbmQgbG93IHN0cmVzcyB0b3RhbCBtaWxlYWdlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAndG90YWxfa21fbG93X3N0cmVzcycsDQogICAgKA0KICAgICAgICBTRUxFQ1QNCiAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICBTVU0oU1RfTGVuZ3RoKFNUX0ludGVyc2VjdGlvbih3Lmdlb20sIGIuZ2VvbWV0cnkpKSAqDQogICAgICAgICAgICAgICAgICAgIENBU0UgZnRfc2VnX3N0cmVzcyBXSEVOIDEgVEhFTiAxIEVMU0UgMCBFTkQpICsNCiAgICAgICAgICAgICAgICBTVU0oU1RfTGVuZ3RoKFNUX0ludGVyc2VjdGlvbih3Lmdlb20sIGIuZ2VvbWV0cnkpKSAqDQogICAgICAgICAgICAgICAgICAgIENBU0UgdGZfc2VnX3N0cmVzcyBXSEVOIDEgVEhFTiAxIEVMU0UgMCBFTkQpDQogICAgICAgICAgICApIC8gMTAwMCBhcyBkaXN0DQogICAgICAgIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBhcyB3LCByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgIFdIRVJFIFNUX0ludGVyc2VjdHMody5nZW9tLCBiLmdlb21ldHJ5KQ0KICAgICksDQogICAgJ1RvdGFsIGxvdy1zdHJlc3Mga20nOw0KDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAndG90YWxfa21faGlnaF9zdHJlc3MnLA0KICAgICgNCiAgICAgICAgU0VMRUNUDQogICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgU1VNKFNUX0xlbmd0aChTVF9JbnRlcnNlY3Rpb24ody5nZW9tLCBiLmdlb21ldHJ5KSkgKg0KICAgICAgICAgICAgICAgICAgICBDQVNFIGZ0X3NlZ19zdHJlc3MgV0hFTiAzIFRIRU4gMSBFTFNFIDAgRU5EKSArDQogICAgICAgICAgICAgICAgU1VNKFNUX0xlbmd0aChTVF9JbnRlcnNlY3Rpb24ody5nZW9tLCBiLmdlb21ldHJ5KSkgKg0KICAgICAgICAgICAgICAgICAgICBDQVNFIHRmX3NlZ19zdHJlc3MgV0hFTiAzIFRIRU4gMSBFTFNFIDAgRU5EKQ0KICAgICAgICAgICAgKSAvIDEwMDAgYXMgZGlzdA0KICAgICAgICBGUk9NIHJlY2VpdmVkLnNhX3dheXMgYXMgdywgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICBXSEVSRSBTVF9JbnRlcnNlY3RzKHcuZ2VvbSwgYi5nZW9tZXRyeSkNCiAgICApLA0KICAgICdUb3RhbCBoaWdoLXN0cmVzcyBrbSc7DQoNClVQREFURSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMNClNFVCAgICBzY29yZV9ub3JtYWxpemVkID0gUk9VTkQoc2NvcmVfb3JpZ2luYWwsIDEpDQpXSEVSRSAgc2NvcmVfaWQgaW4gKCd0b3RhbF9rbV9sb3dfc3RyZXNzJywgJ3RvdGFsX2ttX2hpZ2hfc3RyZXNzJyk7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzDQpgYGANCg0KIyMgUmVzdWx0cyANCg0KVGhlIG92ZXJhbGwgcmVzdWx0cyBvYnRhaW5lZCBpbmNsdWRlIHRoZSBmaW5hbCBzY29yZSBmb3IgdGhlIHdob2xlIGNpdHksIGFzIHdlbGwgYXMgdGhlIHNjb3JlIHBlciBkZXN0aW5hdGlvbiBjYXRlZ29yeS4gVGhlIHRvdGFsIHBvcHVsYXRpb24gYW5kIHN0cmVzcyBuZXR3b3JrIGlzIGFsc28gY2FsY3VsYXRlZC4gVGhlIHJlc3VsdHMgY2FuIGJlIG9ic2VydmVkIG9uIHRoZSBmb2xsb3dpbmcgdGFibGUuIA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQpibmFfZGlzcGxheSA8LSBibmFfc2NvcmUNCg0KYm5hX2Rpc3BsYXkkY2F0ZWdvcnkgPC0gYygNCiAgIlRvdGFsIFBlb3BsZSIsDQogICJFbXBsb3ltZW50IiwNCiAgIkstMTIgRWR1Y2F0aW9uIiwNCiAgIlRlY2huaWNhbC92b2NhdGlvbmFsIHNjaG9vbCIsDQogICJIaWdoZXIgRWR1Y2F0aW9uIiwNCiAgIlRvdGFsIE9wcG9ydHVuaXR5IiwNCiAgIkRvY3RvciBvZmZpY2VzL2NsaW5pY3MiLA0KICAiRGVudGlzdCBvZmZpY2VzIiwNCiAgIkhvc3BpdGFscyIsDQogICJQaGFybWFjaWVzIiwNCiAgIlN1cGVybWFya2V0cyIsDQogICJTb2NpYWwgc2VydmljZXMiLA0KICAiVG90YWwgQ29yZSBTZXJ2aWNlcyIsDQogICJUb3RhbCBSZXRhaWwgc2hvcHBpbmciLA0KICAiUGFya3MiLA0KICAiUmVjcmVhdGlvbmFsIHRyYWlscyIsDQogICJDb21tdW5pdHkgY2VudGVycyIsDQogICJUb3RhbCBSZWNyZWF0aW9uIiwNCiAgIlRvdGFsIFRyYW5zaXQiLA0KICAiT3ZlcmFsbCBTY29yZSIsDQogICJQb3B1bGF0aW9uIiwNCiAgIkxlbmd0aCBvZiBMb3cgU3RyZXNzIE5ldHdvcmsgKGttKSIsDQogICJMZW5ndGggb2YgSGlnaCBTdHJlc3MgTmV0d29yayAoa20pIg0KKQ0KDQpibmFfZGlzcGxheSRpZCA8LSBOVUxMDQpibmFfZGlzcGxheSRzY29yZV9pZCA8LSBOVUxMDQoNCmJuYV9kaXNwbGF5JHNjb3JlIDwtIGJuYV9kaXNwbGF5JHNjb3JlX25vcm1hbGl6ZWQNCmJuYV9kaXNwbGF5WzIxLDVdIDwtIHJvdW5kKGJuYV9kaXNwbGF5WzIxLDFdLDApDQoNCmJuYV9kaXNwbGF5JHNjb3JlX29yaWdpbmFsIDwtIE5VTEwNCmJuYV9kaXNwbGF5JHNjb3JlX25vcm1hbGl6ZWQgPC0gTlVMTA0KDQpibmFfZGlzcGxheSA8LSBibmFfZGlzcGxheVtjKDIwOjIzLDE6MTkpLF0NCnJvdy5uYW1lcyhibmFfZGlzcGxheSkgPC0gTlVMTA0KDQpibmFfZGlzcGxheSA8LSBibmFfZGlzcGxheSAlPiUgbXV0YXRlKA0KICBjYXRlZ29yeSA9IGNlbGxfc3BlYygNCiAgICBjYXRlZ29yeSwNCiAgICBib2xkID0gaWZlbHNlKA0KICAgICAgZ3JlcGwoIlRvdGFsIixjYXRlZ29yeSksDQogICAgICBULCANCiAgICAgIEYNCiAgICApDQogICksDQogIHNjb3JlID0gY2VsbF9zcGVjKA0KICAgIHNjb3JlLA0KICAgICJodG1sIiwgDQogICAgY29sb3IgPSBpZmVsc2UoDQogICAgICBzY29yZSA+PSA1NCAmIHNjb3JlIDwgMTAwLA0KICAgICAgIiMwMDlhY2QiLA0KICAgICAgaWZlbHNlKA0KICAgICAgICBzY29yZSA8IDU0LA0KICAgICAgICAiI2ZmMzAzMCIsDQogICAgICAgICIjNjY2NjY2Ig0KICAgICAgICApDQogICAgKQ0KICApDQopDQoNCmNvbG5hbWVzKGJuYV9kaXNwbGF5KSA8LSBjKCJwb3BvdmVyIiwiIiwiU2NvcmUvVmFsdWUiKQ0KDQprYWJsZSgNCiAgYm5hX2Rpc3BsYXlbMjozXSwgDQogIGFsaWduID0gYygibCIsInIiKSwgDQogIGZvcm1hdCA9ICJodG1sIiwgDQogIGVzY2FwZSA9IEYNCikgJT4lIA0KICAga2FibGVfc3R5bGluZygNCiAgICAgImhvdmVyIiwNCiAgICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgICBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICkgJT4lIA0KICBncm91cF9yb3dzKCJQZW9wbGUiLCA1LCA1KSAlPiUgDQogIGdyb3VwX3Jvd3MoIk9wcG9ydHVuaXR5IiwgNiwgMTApICU+JSANCiAgZ3JvdXBfcm93cygiQ29yZSBTZXJ2aWNlcyIsIDExLCAxNykgJT4lIA0KICBncm91cF9yb3dzKCJSZXRhaWwiLCAxOCwgMTgpICU+JQ0KICBncm91cF9yb3dzKCJSZWNyZWF0aW9uIiwgMTksIDIyKSAlPiUgDQogIGdyb3VwX3Jvd3MoIlRyYW5zaXQiLCAyMywgMjMpDQpgYGANCg0KV2UgY2FuIHBsb3QgdGhlIHJlc3VsdHMgdG8gaGF2ZSBhIHF1aWNrIHZpZXcgb2YgdGhlIG91dHB1dCwgaW5jbHVkaW5nIHRoZSBoaWdoIGFuZCBsb3cgc3RyZXNzIG5ldHdvcmsgaW4gYW4gaW50ZXJhY3RpdmUgd2F5LiANCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmxpYnJhcnkoc2YpDQpibmFfc2NvcmUgPC0gc3RfcmVhZCgNCiAgZHNuID0gY29ubmVjdGlvbiwNCiAgbGF5ZXIgPSBjKCJnZW5lcmF0ZWQiLCJzYV9wb3BfZ3JpZCIpDQopDQoNCnN0cmVzc19uZXR3b3JrIDwtIHN0X3JlYWQoDQogIGRzbiA9IGNvbm5lY3Rpb24sDQogIHF1ZXJ5ID0gIlNFTEVDVCBmdF9zZWdfc3RyZXNzLCB0Zl9zZWdfc3RyZXNzLCBnZW9tIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyINCikNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodD0gOCwgIGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0V9DQpibmFfcGFsIDwtIGMoIiNGQzcxNTEiLCIjREM3RTZBIiwiI0M5ODg3NSIsIiNDMDhCODMiLCIjQUQ5Mzk2IiwNCiAgICAgICAgICAgICAiIzlDOUE5RiIsIiM5MjlFQUMiLCIjNzhBQUM1IiwiIzZGQURDQiIsIiM0OUJGRTYiKQ0KDQpibmFfYnJlYWtzIDwtIGMoNiwxMiwxOCwyNCwzMCwzNiw0Miw0OCw1NCwxMDApDQoNCnN0cmVzc19uZXR3b3JrJGZ0X3N0cmVzcyA8LSBpZmVsc2Uod2F5cyRmdF9zZWdfc3RyZXNzID09IDEsImxvdyBzdHJlc3MiLCJoaWdoIHN0cmVzcyIpDQpzdHJlc3NfbmV0d29yayR0Zl9zdHJlc3MgPC0gaWZlbHNlKHdheXMkdGZfc2VnX3N0cmVzcyA9PSAxLCJsb3cgc3RyZXNzIiwiaGlnaCBzdHJlc3MiKQ0KDQpsaWJyYXJ5KHRtYXApDQp0bWFwX21vZGUoInZpZXciKQ0KaW50X21hcCA8LSANCiAgdG1hcDo6dG1hcF9sZWFmbGV0KA0KICAgICB0bWFwOjp0bV92aWV3KA0KICAgICBiYXNlbWFwcyA9IGMoDQogICAgICAgIkNhcnRvREIuUG9zaXRyb24iLA0KICAgICAgICJDYXJ0b0RCLkRhcmtNYXR0ZXIiLA0KICAgICAgICJPcGVuU3RyZWV0TWFwLk1hcG5payINCiAgICAgKQ0KICAgKSArDQogICAgIHRtYXA6OnRtX3NoYXBlKGJuYV9zY29yZSkgKw0KICAgICB0bWFwOjp0bV9wb2x5Z29ucygNCiAgICAgICBjb2wgPSAib3ZlcmFsbF9zY29yZSIsDQogICAgICAgc3R5bGUgPSAiZml4ZWQiLA0KICAgICAgIGJyZWFrcyA9IGJuYV9icmVha3MsDQogICAgICAgcGFsZXR0ZSA9IGJuYV9wYWwsDQogICAgICAgYWxwaGEgPSAwLjgsDQogICAgICAgdGl0bGUgPSAiQk5BIHNjb3JlIiwNCiAgICAgICBib3JkZXIuY29sID0gTlVMTCwNCiAgICAgICBjb2xvck5BID0gTlVMTCwNCiAgICAgICBzaG93TkEgPSBGQUxTRQ0KICAgICAgKSArDQogICAgIHRtYXA6OnRtX3NoYXBlKHN0cmVzc19uZXR3b3JrKSArDQogICAgIHRtYXA6OnRtX2xpbmVzKA0KICAgICAgIGNvbCA9ICJmdF9zdHJlc3MiLCANCiAgICAgICBjb2xvck5BID0gTlVMTCwNCiAgICAgICBzaG93TkEgPSBGQUxTRSwNCiAgICAgICBwYWxldHRlID0gYygiZmlyZWJyaWNrMSIsICJkZWVwc2t5Ymx1ZTMiKSwNCiAgICAgICB0aXRsZS5jb2wgPSAiU3RyZXNzIG5ldHdvcmsiDQogICAgICApICsNCiAgICAgdG1hcDo6dG1fc2hhcGUoc3RyZXNzX25ldHdvcmspICsNCiAgICAgdG1hcDo6dG1fbGluZXMoDQogICAgICAgY29sID0gInRmX3N0cmVzcyIsIA0KICAgICAgIGNvbG9yTkEgPSBOVUxMLA0KICAgICAgIHNob3dOQSA9IEZBTFNFLA0KICAgICAgIHBhbGV0dGUgPSBjKCJmaXJlYnJpY2sxIiwgImRlZXBza3libHVlMyIpLA0KICAgICAgIGxlZ2VuZC5jb2wuc2hvdyA9IEZBTFNFDQogICAgICApDQogICkNCg0KaW50X21hcA0KYGBgDQoNCiMjIE9ic2VydmF0aW9ucw0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCmVuZCA8LSBTeXMudGltZSgpDQoNCmR1cmF0aW9uIDwtIGVuZCAtIHN0YXJ0DQoNCmR1cmF0aW9uDQpgYGANCg0KKiBUaGUgdG90YWwgdGltZSB0aGF0IHRoaXMgcGFydGljdWxhciBjaXR5IHRvb2sgdG8gY29tcHV0ZSBpdHMgQk5BLCBpbmNsdWRpbmcgcGxvdHMsIG92ZXJwYXNzIGRvd25sb2FkLCBidXQgd2l0aG91dCBgR0VPU1RBVGAgZGF0YSBkb3dubG9hZCBvbiBzeXN0ZW0sIHVwbG9hZCBvbiBmaWxlLCBhbmQgcHJvY2Vzc2luZyBvbiBkYXRhYmFzZSB3YXMgKipgciByb3VuZChhcy5udW1lcmljKGR1cmF0aW9uKSwyKWAgbWludXRlcyoqLiBBZGRpbmcgdGhlIGBHRU9TVEFUYCBwcm9jY2Vzc2luZyB0byB0aGUgd29ya2Zsb3cgYWRkcyBhcm91bmQgNSBtaW51dGVzLg0KDQoqIFdoYXQgY2FuIGJlIG9ic2VydmQgZm9yIHRoZSB3aG9sZSBhbmFseXNpcyBpcyB0aGF0IHRoZSByZXN1bHRpbmcgQk5BIHNjb3JlIGlzIGhpZ2hseSBpbmZsdWVuY2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIGpvYi9lbXBsb3ltZW50IGRhdGEgaXMgbm90IGF2YWlsYWJsZS4gSG93ZXZlciwgdGhpcyB3YXMgYW4gYXR0ZW1wdCB0byByZXByb2R1Y2UgdGhlIHNjb3JlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIGFzIFBmQiBhcHBseSB0aGVpciBtZXRob2RvbG9neSwganVzdCB0byBleHBsb3JlIGl0cyByZXByb2R1Y2liaWxpdHkuIA0KDQoqIE15IHBsYW4gbmV4dCBpcyB0byBleGNsdWRlIHRoaXMgdmFyaWFibGUgZnJvbSB0aGUgQk5BIHNjb3JlIGNvbXB1dGF0aW9uLCBhbmQgcGVyaGFwcyBpbmNsdWRlIHNvbWUgb3RoZXIgdmFyaWFibGVzIHRoYXQgd291bGQgc3VpdCB0aGUgRXVyb3BlYW4gY29udGV4dCBiZXR0ZXIuIA0KDQoqIE15IGZpbmFsIGdvYWwgZm9yIHRoZSBtb21lbnQgaXMgdG8gdHJ5IHRvIHZhbGlkYXRlIHRoZSBzY29yaW5nIG1ldGhvZG9sb2d5IGZvciBFdXJvcGUuIEkgcGlja2VkIGEgY2l0eSBpbiB0aGUgVUsgYXMgSSBrbm93IHRoZXJlIGlzIE9yaWdpbi1EZXN0aW5hdGlvbiBkYXRhIGF2YWlsYWJsZSB0aGF0IGNvdWxkIGJlIHVzZWQgYXMgYSB2YWxpZGF0aW9uIG1ldGhvZC4g